希爾排序屬於插入排序的一種,每次設定乙個步長dk,則把原陣列分為dk個分陣列:
a1[0,dk,2dk,3dk,4dk,...].
a2[1,dk+1,2dk+1,3dk+1,4dk+1,...]
a3[2,dk+2,2dk+2,3dk+2,4dk+2,...]
。。。。。。
每個分陣列分別進行直接插入排序。
然後將dk的值逐漸減小,再進行如上排序。直到減小到1時,原陣列最後進行的就是一次直接插入排序。這樣陣列就排好序了。
dk的初始值一般為原陣列a的長度len的一半,為dk=len/2;
dk的結尾值為1;每一次dk/=2; 呈指數型減小。
問題:為何要進行dk>1時的哪些排序?直接dk=1,直接插入排序不就完事了嗎。 答:
插入排序的時間複雜度是與陣列的狀態有關的。進行了dk>1的那些排序後,會大大減小dk=1時的排序。當n處於某個特定範圍內時,希爾排序的時間複雜度為o(n^1.3).在最壞情況下,希爾排序的時間複雜度為o(n*n).
void shellsort(int a, int n){
int dk;
for(dk=n/2;dk>=1;dk/=2){//dk在呈指數性減小。
for(int i=dk;i=0;j-=dk){
if(temp
排序 希爾排序
希爾排序 shell sort 又稱為縮小增量排序,輸入插入排序演算法,是對直接排序演算法的一種改進。本文介紹希爾排序演算法。對於插入排序演算法來說,如果原來的資料就是有序的,那麼資料就不需要移動,而插入排序演算法的效率主要消耗在資料的移動中。因此可知 如果資料的本身就是有序的或者本身基本有序,那麼...
排序 希爾排序
縮小增量排序 待排序列按關鍵字基本有序時,直接插入排序的效率很高 希爾排序思想 將整個待排記錄分割為若干子串行分別進行直接插入排序,待整個序列中的記錄基本有序時,再對全體記錄進行一次直接插入排序,就可以完成整個排序工作 增量序列中的值沒有除1以外的公因子,且最後乙個增量必須等於1 子串行的構成不是逐...
排序 希爾排序
希爾排序是插入排序中的乙個分支,但是較簡單插入排序又有較大的改進,這使得它成為了歷史上第一批突破二次時間屏障的排序演算法之一哦。它是通過比較一定間隔的元素來工作的。因此希爾排序又稱為縮小增量排序。直接插入排序對於原始資料基本有序的情況下,效率較高。在此的基礎上。我們可以想辦法,使資料基本有序,然後利...