一. 插入類排序
1. 直接插入排序
待排數列初始狀態是正序,反序,無序時的時間複雜度為o(n), o(n^2), o(n^2)
是穩定的排序演算法
2. 二分插入排序
3.希爾排序
希爾排序優於直接插入排序。理由:1> 當待排數列大致有序時,比較和移動的次數較少(比較後才移動,比較的少自然移動的少,移動的少比較的也少)
2> 當待排數列元數個數較少時,n 與 n^2 的差距也小。即o(n)與o(n^2)差不多
3>希爾排序剛開始時,增量大,分組多,之後增量減少,分組減少,組內元素增加,但卻大致有序,故希爾排序在效率上較直接插入排序有較大的改進!
希爾排序是不穩定的演算法,即相同關鍵字排序後的相對順序()會改變
插入類排序的基本思想是:把無序區的記錄按關鍵字大小,插入已排好的有序區內!
1. 直接插入排序
大體思路:a>把無序區的記錄按關鍵字大小,插入已排好的有序區內!
b>單趟具體如何插入?把無序區的待排記錄,從後向前與有序區的元素相比,不一定比較到第乙個元素!
void insert_sort(int a, int len)
a[j + 1] = tmp;
}
return ;
}2. 二分法插入排序
int binary_search(int a, int len, int x)
return left;
}void binary_sort(int a, int len)
a[j + 1] = tmp;
}
}待排數列:9, 8, 3, 1, 7, 4, 10, 14
輸入結果:3 1 4 7 8 9 10 14
檢查了幾遍,一是演算法,符合邏輯,應該沒問題 二呼叫也應該沒問題。。。不知到該檢查什麼了。。。
後來不注意看到 else if (x = a[mid])....比較表示式,怎麼成賦值了啊!知道**有問題了.............腦子不是很清醒時,就易犯這種很二的錯誤,並別檢查了幾遍都沒看出來!
所以,三應該檢查語言本身容易出錯的地方,如「==」 寫成 "="
3.希爾排序
大體思路:取乙個小於len的數d1作為第乙個增量,把待排數列分為d1組,所有距離為d1的元數為一組,在組內進行直接插入排序;
然後取第二個增量d2 (d2 < d1),重複上述分組和排序。直至所取的增量dt = 1時,即所有的元素放在乙個組內進行插入排序為止!該方法實質上是分組方法!
void shell_sort(int a, int len)
a[j + gap] = tmp;
}
gap = gap - 1;
}
}另一種方法:每次比較後,進行交換
void shellsorting(t data, size_t len)
}
}********************************************
不足 :變數命名??
3 void shellsorting(int ary, int len)
4 21 ary[j + d] = tmp;
22 }
23 24 d--;
25 } }
資料結構 排序之插入排序
插入排序o n2 的執行時間 思想是 若陣列長度為n 那麼把陣列序號從1到n 1的值依次往前進行比較 這裡需要乙個for迴圈 注意每個數在比較的時候它前面的資料都是已經排好序號的 因為從序號為1時就開始排序了 注意我們這裡用類似堆中下浮和上浮的交換方法 把需要交換的資料拿出來 和前面的資料依次進行比...
資料結構排序之插入排序
package sort 最簡單的排序演算法之一是插入排序 insertion sort 插入排序由n 1躺排序組成。對於 p 1到n 1 趟,插入排序保證從位置0到位置p上的元素為已排序狀態。插入排序利用了這樣的 事實 已知位置0到位置p 1 上的元素處於排過序的狀態。例子 原始陣列 34 8 6...
資料結構之希爾排序(插入排序)
希爾排序 shell s sort 又稱 縮小增量排序 diminishing increment sort 是插入排序的一種,因d.l.shell於1959年提出而得名。希爾排序的誕生是由於插入排序在處理大規模陣列的時候會遇到需要移動太多元素的問題。希爾排序的思想是將乙個大的陣列 分而治之 劃分為...