排序演算法之希爾排序

2021-10-02 16:36:21 字數 1603 閱讀 8699

希爾排序的本質是插入排序的一種改進,它通過比較相距一定間隔的元素來工作,比較的距離隨著個演算法的工作而逐漸減小,一直到元素距離為1的一輪比較結束為止,正是因為由於這份原因,希爾排序又被叫做減小增量的排序。

上面我提到希爾排序是插入排序的一種改進,所謂插入排序就是將乙個無序的陣列a中的資料根據陣列下標乙個個的插入到另乙個陣列b中,並且每次插入之前都會通過比較和後移已經插入的元素的方式,幫助待插入陣列找到乙個合適的位置的排序方法。

由於插入排序的每一次巢狀迴圈都會花費n次迭代,因此插入排序的時間複雜度為o(n2),並且插入排序適合小資料量的排序,如果待排序資料量非常龐大,並且完全無序,那麼在這個時候選擇插入排序就是一種非常愚蠢的選擇。

也正是由於上面的原因,一種基於插入排序的改進演算法誕生了,那就是希爾排序!

如上圖中有乙個擁有10個元素的無序序列,然後我們根據這個陣列的長度來計算它一輪排序的元素距離: int gap = array.lenght/2

gap就是待比較元素的距離,因為例項中的陣列一共有10個元素,所以它第一輪排序的步長就是5.

所以就可以得到陣列的第一次分組:,。

所以第一次比較就是arr[0]=5,arr[5]=4,因為4小於5,arr[0]中的元素就移動到arr[5]當中,而4就放在arr[0],這就完成了第一插入排序,後面的排序同理可得,最後得到當元素間隔為5師,陣列排序結果如下圖所示:

不難看出經過一輪排序,已經將陣列中較大的元素都放到了後面,較小的元素則移動到了前面。

下面是第二輪排序,比較資料的間隔為:gap=5/2=2

這時整個陣列就有了以下分組:

(陣列下標均間隔2)

(陣列下標均間隔2)

然後我們要做的就是對上面兩個進行插入排序:

第一組資料:arr[0],arr[2],arr[4],arr[8,arr[10]]

先令tmp = arr[2]

arr[2]與arr[0],如果tmp小於arr[0],則arr[0]=arr[2],arr[0]=tmp,反之則不動

再令tmp = arr[4]

則如果tmp小於arr[4-gap]即與arr[2]比較,則arr[4]=arr[4-gap],再接著如果tmp小於arr[4-2*gap]即與arr[0],則arr[4-2*gap],後面資料以此類推:

最後得到中間陣列:

再接著就是最後一輪插入排序,與上述同理的gap=2/2=1,即各自與前面的資料比較,小則移動資料。

最後得出排序結果:

下面貼上希爾排序的**:

public static void sort2(int arr)

arr[j]=tmp;}}

}

排序演算法之希爾排序

希爾排序實際上是一種分治思想的插入排序。插入排序不說了,不清楚看這裡 分治思想,對增量為dk,dk遞減,開始很多小序列,最後為乙個大序列 相對直接插入排序,在希爾排序中,只不過增量不是1,而是dk 較好的增量序列是2 k 1,2 k 1 1,7,3,1,這樣可使shell排序時間複雜度達到o n 1...

排序演算法之希爾排序

希爾排序 shell sort 又稱為縮小增量排序,輸入插入排序演算法,是對直接排序演算法的一種改進。本文介紹希爾排序演算法。對於插入排序演算法來說,如果原來的資料就是有序的,那麼資料就不需要移動,而插入排序演算法的效率主要消耗在資料的移動中。因此可知 如果資料的本身就是有序的或者本身基本有序,那麼...

排序演算法之希爾排序

希爾排序,突破了 通過交換相鄰元素進行排序的任何演算法平均需要 n 2 的二次時間限制 通過比較相距一定間隔的元素來工作。使用乙個增量序列 h1 1,h2,ht,在使用乙個 增量h的一趟排序後,對於每乙個i滿足pdata i pdata i h 即此時序列是h排序的 各趟 比較所用的距離逐漸減小,直...