希爾排序又叫縮小增量排序,是2023年 shell 發明的第乙個突破o(n2)的排序演算法,是簡單插入排序的改進版。它與插入排序的不同之處在於,它會優先比較距離較遠的元素。
這種排序是把一定間隔的數當做乙個陣列,在每個分好的陣列裡進行插入排序,再縮小間隔重複步驟,直到間隔為1,直接插入排序所有數。
這樣開始每組資料量都比較小,可以發揮插入的優勢,排序速度比較快,在縮小間隔後,雖然個數增加,但是因為之前已經粗略排了序,有序性比較高,也能發揮插入的優勢,提高效率。
那麼這個間隔(增量)取多少比較好?
增量的取法有各種方案。最初 shell 提出取 increment=n/2 向下取整,increment=increment/2 向下取整,直到 increment=1。但由於直到最後一步,在奇數字置的元素才會與偶數字置的元素進行比較,這樣使用這個序列的效率會很低。後來 knuth 提出取 increment=n/3 向下取整 +1 ,還有人提出都取奇數為好,也有人提出 increment 互質為好。應用不同的序列會使希爾排序演算法的效能有很大的差異。 這裡使用 n/3 向下取整 +1 的方法。
舉個栗子來理解:01
2345
67128
57141
62第一趟,取增量increment = n/3 + 1 = 3,將數列劃分為以 3 為間隔的數列(這裡用同種顏色表示同一序列)
0
1
2
3
4
5
6
7128
57141
62在每個序列中進行插入排序
1
2
4
5
785
14120
2
3
5
665
71120
1
3
4
6
762
781214
第一趟結束後的排序01
2345
6762
1785
1214
再開始第二趟之旅,這次我們取增量為increment = increment/3 + 1 = 2(都是向下取整),為了看得清咱一組一組來13
5762
1785
1214
排序後結果13
5727
514同樣的,另一組排序
上面那個就是第二趟排序結果啦,最後第三趟排序,也就是增量為1(increment = increment/3 + 1 = 1),直接插入排序就可得到最終結果
其實就是直接插入排序的外層多了個間隔 increment 的迴圈
希爾排序(Shell s Sort)
希爾排序,也稱遞減增量排序演算法,是插入排序的一種更高效的改進版本。但希爾排序是非穩定排序演算法。演算法思想 希爾排序的基本思想是 先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄 基本有序 時,再對全體記錄進行依次直接插入排序。演算法步驟 1.選擇乙個增量序列t1...
排序(1) 希爾排序(Shell s Sort)
假設有這樣一組數 如果我們以步長為 5開始進行排序 13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10然後我們對每列進行排序 即小的數放前 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45將上述四行數字,依序接...
插入排序 希爾排序(Shell s Sort)
希爾排序 shell sort 是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因dl shell於1959年提出而得名。先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄 基本有序 時,再對全體記錄進...