希爾排序(Shell Sort)

2021-07-27 04:01:49 字數 3013 閱讀 7268

希爾排序(shell sort)是插入排序的一種。也稱縮小增量排序,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。該方法因dl.shell於2023年提出而得名。

希爾排序按其設計者希爾(donald shell)的名字命名,該演算法由2023年公布。一些老版本教科書和參考手冊把該演算法命名為shell-metzner,即包含marlene metzner norton的名字,但是根據metzner本人的說法,「我沒有為這種演算法做任何事,我的名字不應該出現在演算法的名字中。」

希爾排序是基於插入排序的以下兩點性質而提出改進方法的:

先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分組。所有距離為d1的倍數的記錄放在同乙個組中。先在各組內進行直接插入排序;然後,取第二個增量d2 < d1重複上述的分組和排序,直至所取的增量 =1( < … < d2 < d1),即所有記錄放在同一組中進行直接插入排序為止。

該方法實質上是一種分組插入方法。

比較相隔較遠距離(稱為增量)的數,使得數移動時能跨過多個元素,則進行一次比較就可能消除多個元素交換。演算法先將要排序的一組數按某個增量d分成若干組,每組中記錄的下標相差d.對每組中全部元素進行排序,然後再用乙個較小的增量對它進行,在每組中再進行排序。當增量減到1時,整個要排序的數被分成一組,排序完成。

希爾排序的時間複雜度與增量序列的選取有關,例如希爾增量時間複雜度為o(n²),而hibbard增量的希爾排序的時間複雜度為o(n^2/3),希爾排序時間複雜度的下界是nlog2n。希爾排序沒有快速排序演算法快:o(n(logn)),中等大小規模表現良好,對規模非常大的資料排序不是最優選擇。但是比o(n²)複雜度的演算法快得多,也就是說基本上優於冒泡、選擇排序。

希爾排序的執行時間依賴於增量序列。

合適的增量序列特徵:

有人通過大量的實驗,給出了較好的結果:當n較大時,比較和移動的次數約在nl.25到1.6n1.25之間。

希爾排序的時間效能優於直接插入排序的原因:

一次插入排序是穩定的,不會改變相同元素的相對順序,但在不同的插入排序過程中,由於多次插入排序,相同的元素可能在各自的插入排序中移動,最後其穩定性就會被打亂,因此,希爾排序是不穩定的

**已上注釋。

/**

*@author hanlin wang

*/public

class

shellsort ;

shellsort.sort(data);

}public

static

void

sort(int data)

//最後將原來的被插入的元素賦值在指定的索引上。

data[j] = k;

//列印本輪結果

string txt = "";

for (int a : data)

system.out.println("第" + (++l) + "輪排序的結果為:");

system.out.println(txt.substring(0, txt.length() - 1) + "\n");

}l = 0;}}

}

執行結果:

當 increment = 5

第1輪排序的結果為:

28,68,59,52,72,57,96,33,24,19

第2輪排序的結果為:

28,68,59,52,72,57,96,33,24,19

第3輪排序的結果為:

28,68,33,52,72,57,96,59,24,19

第4輪排序的結果為:

28,68,33,24,72,57,96,59,52,19

第5輪排序的結果為:

28,68,33,24,19,57,96,59,52,72

當 increment = 2

第1輪排序的結果為:

28,68,33,24,19,57,96,59,52,72

第2輪排序的結果為:

28,24,33,68,19,57,96,59,52,72

第3輪排序的結果為:

19,24,28,68,33,57,96,59,52,72

第4輪排序的結果為:

19,24,28,57,33,68,96,59,52,72

第5輪排序的結果為:

19,24,28,57,33,68,96,59,52,72

第6輪排序的結果為:

19,24,28,57,33,59,96,68,52,72

第7輪排序的結果為:

19,24,28,57,33,59,52,68,96,72

第8輪排序的結果為:

19,24,28,57,33,59,52,68,96,72

當 increment = 1

第1輪排序的結果為:

19,24,28,57,33,59,52,68,96,72

第2輪排序的結果為:

19,24,28,57,33,59,52,68,96,72

第3輪排序的結果為:

19,24,28,57,33,59,52,68,96,72

第4輪排序的結果為:

19,24,28,33,57,59,52,68,96,72

第5輪排序的結果為:

19,24,28,33,57,59,52,68,96,72

第6輪排序的結果為:

19,24,28,33,52,57,59,68,96,72

第7輪排序的結果為:

19,24,28,33,52,57,59,68,96,72

第8輪排序的結果為:

19,24,28,33,52,57,59,68,96,72

第9輪排序的結果為:

19,24,28,33,52,57,59,68,72,96

希爾排序(Shell Sort)

希爾排序 shell sort 又叫做縮小增量排序 diminishing increment sort 是一種很優秀的排序法,演算法本身不難理解,也很容易實現,而且它的速度很快。基本思想 先取乙個小於n的整數d1作為第乙個增量,把檔案的全部記錄分成d1個組。所有距離為dl的倍數的記錄放在同乙個組中...

希爾排序 shellsort

希爾排序 shellsort 又叫增量遞減 diminishing increment 排序,是由d.l.shell發明的,這個演算法是通過乙個逐漸減小的增量使乙個陣列逐漸趨近於有序從而達到排序的目的。假設有乙個陣列int data 16 首先將這個增量設為16 2 8,這樣就將這個陣列分成了8個子...

希爾排序(ShellSort)

希爾排序 shellsort cpp view plain copy include shellsort.h include print.h 希爾排序,分組進行插入排序,最後一步仍然是插入排序,但是因為之前的操作使逆序數減少,所以相對單純的插入排序效率高。void shellsort inta,in...