演算法 排序之希爾排序

2021-08-04 10:12:34 字數 1663 閱讀 7274

希爾

排序得名於其設計者

設計者希爾

(donald shell),設計體現了計算機領域的「分治法」思想。在眾多排序演算法中,目前而言,希爾排序是唯一能在效率上與快速排序(【演算法-排序之二】快速排序)一較高低的演算法,目前只有這兩種排序演算法的時間複雜度突破o(n2)。值得一提的是,希爾排序與快速排序都基於「分治法」,從這裡或許可以解釋這兩種排序演算法在效率上的得天獨厚。

1. 希爾排序shellsort()

核心:先將序列分成較多個子串行分別進行排序,再分成較少個子序列分別進行排序,直到最後為乙個序列排序。

形象的說:比如先分成  8  個子序分別排序,再 4  個子序,再 2 個子序,最後 1 個(1個也就是全部序列啦)。

希爾排序的實現方法:

1.1如何劃分子串行:希爾排序採用每隔固定距離選取乙個數的方法劃分子序。其中間隔距離稱為增量。如圖:

通過圖示,增量的概念很容易理解吧,增量就是隔多少距離的數都為同乙個子序。通過這種方法,如果增量選擇為n,那麼可以分為n個子序,想想是不是這樣哦。每次子序都排好後,增量減半,增量減少意味著子序數減少,直到增量為1,便是全部的數序了,希爾排序完成。

1.2子序內部怎麼排序:

講述1的過程中,說道劃分子序後對子序分別排序,那麼採取什麼排序方法?希爾排序的子序排序方法為插入排序(【演算法-排序之三】插入排序)。

演算法實現:

希爾排序的**並不複雜,通過增量是否為1控制整個排序的結束。在增量為為d時,遍歷此時的d個子序,從k=0到k=d-1。隨後對每個子序進行插入排序操作。

123

4567

891011

1213

1415

1617

1819

2021

void

shellsort

(int

array

,intn)

array[j

+d]=

temp

; }

}d=d

/2;//縮小增量}}

來自code的**片

shellsort.c

2.演算法複雜度

希爾排序的演算法複雜度分析可模擬快速排序(【演算法-排序之二】快速排序)複雜度分析,一般認為希爾排序時間複雜度為:o(nlogn)。

3.空間複雜度:

希爾排序的空間複雜度顯然為o(1),僅僅需要乙個交換變數。相比快速排序遞迴呼叫產生的巨大棧消耗,希爾排序o(1)的空間消耗顯得十分讓人驚喜。

排序演算法之希爾排序

希爾排序實際上是一種分治思想的插入排序。插入排序不說了,不清楚看這裡 分治思想,對增量為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排序的 各趟 比較所用的距離逐漸減小,直...