希爾排序基本思想就是分組的直接插入排序!
如何分組呢?希爾排序是以間距來分組的!
那間距又如何取呢?希爾排序是以傳進來的資料序列的長度作為間距初始值的,每一趟排序都是將資料序列的一半作為間距來進行排序操作,直到間距取為1,停止排序。
有了間距又如何來排序呢?其實就是分組的直接插入排序,只是直接插入排序的間距是1,而希爾排序的間距為上述值。
package top.einino.insertionsort;
public class shellsort
keys[j+delta] = temp;
}system.out.print("delta="+delta+" ");
print(keys);}}
//降序排序
public static void shellsortdesc(int keys)
keys[j+delta] = temp;
}system.out.print("delta="+delta+" ");
print(keys);}}
//輸出排序陣列
private static void print(int keys)
system.out.println();
}public static void main(string args) ;
//測試公升序排序
shellsort.shellsortasc(keys);
int keys2 = ;
//測試降序排序
shellsort.shellsortdesc(keys2);}}
又是體育老師來排隊(公升序排序)了,但此次隊伍稍微長了一點點,總共有9位學生!初始序列為:
a學生138,b學生155,c學生165,d學生197,e學生127,f學生176,g學生127,h學生113,i學生119
老師開始第一趟排序,首先老師要做的事情是分好組,數數總共有9個學生,9/2=4,按陣列的序號從0開始,第4個位置的元素就是第五個學生,然後以間距為4作為分組條件:
分組情況為:a、e、i為第一組,b、f為第二組,c、g為第三組,d、h為第四組總共四組
分組好了,老師就第一組開始進行排序了,首先把e學生拉出隊伍,(比較規則比前不比後)與a學生進行比較,結果e老師開始第二組排序,首先把f學生拉出隊伍,與b學生進行比較,結果f>b,因為f比b大,f後面又沒有其他學生了,所以老師把f學生排到原來的位置,並結束了此組的排序,第二組的排序還是b、f
同樣的道理進行第三組與第四組的排序,分別得到的結果是
第三組排序:g、c
第四組排序:h、d
老師這時也結束第一趟的排序了,最後的結果為:i學生119、b學生155、g學生127、h學生113、e學生127、f學生176、
c學生165、d學生197、
a學生138、此趟排序後分組的排序都趨於公升序狀態了
老師進行第二趟排序,首先還是要分組,此次分組間距是由上一趟的間距/2來決定的,所以是4/2=2,所以間距為2,從第三個同學即g學生開始排序,分組情況為:
第一組:i學生、g學生、e學生、c學生、a學生
第二組:b學生、h學生、f學生、d學生
老師從第一組開始排序,首先將g學生拉出隊伍,與i學生進行比較,結果g>i,將g排到原來的位置!接著拉出e學生,與g學生進行比較,結果e=g,因為排序規則是僅當g>e才會將g學生排到e學生的位置,所以老師依然會將e學生排到原來的位置。然後拉出c學生,與e學生進行比較,結果c>e,將c排到原來的位置。將a學生拉出隊伍,與c學生進行比較,結果ae,老師就將a學生排到原來c學生的位置,結束 第一組的排序,此次排序結果為:i、g、e、a、c
老師開始的第二組的排序,首先將h學生拉出隊伍,與b學生進行比較,結果hb,將f學生排到原來的位置,此時排序順序不變。將d學生拉出隊伍,與f學生進行比較,結果d>f,將d學生排到原來的位置,此時第二組的排序仍不變h、b、f、d
第二趟排序的最終結果為i學生119、h學生113
、g學生127、b學生155
、e學生127、f學生176、a學生138、d學生197、c學生165、
老師進行第三趟排序,間距為2/2=1,即最後一趟排序了,從第二個學生(h學生)開始排序
分組情況為:
第一組:i學生119、h學生113、g學生127、b學生155、e學生127、f學生176、a學生138、d學生197、c學生165、
老師開始從第一組也是唯一一組進行排序,
將h學生拉出隊伍,與i學生進行比較,結果h>i,把h學生排到原來的位置。
將g學生拉出隊伍,與h學生進行比較,結果g>h,把g學生排到原來的位置。
將b學生拉出隊伍,與g學生進行比較,結果b>g,把b學生排到原來的位置。
將e學生拉出隊伍,與b學生進行比較,結果ei學生119、h學生113、g學生127、e學生127、b學生155、f學生176、a學生138、d學生197、c學生165、
將f學生拉出隊伍,與b學生進行比較,結果f>b,把f學生排到原來的位置
同樣的道理進行最後的三位學生的排序
得到最後的排序的結果為:i學生119、h學生113、g學生127、e學生127、a學生138、b學生155、c學生165、f學生176、d學生197、
希爾排序演算法的時間複雜度分析比較複雜,實際所需的時間取決於具體的增量序列。
希爾排序演算法中的temp占用乙個儲存單元,空間複雜度為o(1)
在希爾排序演算法中,會錯過關鍵字相等的比較,比如上面的例子g學生127、e學生127、但是g學生在第一趟排序過程中,直接與c學生進行比較跳過了與e學生的比較,導致關鍵字相等的元素在最後的結果發生的順序的改變,所以希爾演算法是不穩定的。
本博文從希爾插入排序演算法分析,公升序和降序**實現,老師排隊的例子講演,時間複雜度,空間複雜度以及穩定性,介紹了希爾排序的方方面面。
資料結構之希爾排序
直接插入排序在資料量較小而且接近 正序 的時候,時間複雜度可以小至o n 所以如果我們能夠讓資料量變小且變得接近 正序 然後用直接插入排序就好了。希爾排序就是做這麼個事情,它首先將資料拆成幾部分,即達到縮小資料規模排序,再將資料合併起來,達到整體的 正序 然而將資料的正序並非區域性的 正序 即不是 ...
資料結構之 希爾排序
基本思想 將待排序的序列分為若干組,在每組內進行直接插入排序,以使整個序列基本有序,然後再對整個序列進行直接插入排序。該方法實質上是一種分組插入方法。具體來說,先取乙個小於n的整數d1作為增量,把檔案的全部記錄分組。所有距離為d1的倍數的記錄放在同乙個組中。現在各組內進行直接插入排序 然後,取第二個...
資料結構(排序) 希爾排序
希爾排序 希爾排序又稱縮小增量排序,是1959年由d.l.shell提出來的。演算法描述 1 先取定乙個小於n的整數gap1作為第乙個增量,把整個序列分成gap1組。所有距離為gap1的倍數的元素放在同一組中,在各組內分別進行排序 分組內採用直接插入排序或其它基本方式的排序 2 然後取第二個增量ga...