排序算法——希爾排序 Shell Sort

希爾排序(ShellSort)也稱遞減增量排序算法,其實它是插入排序的優化版本。希爾排序是非穩定排序算法。

希爾排序對插入排序的以下兩點進行改進:

(1)插入排序在對幾乎已經排好序的數據操作時,效率高,即可以達到線性排序的效率;

(2)一般來說插入排序是低效的,因爲插入排序每次只能將數據移動一位。

原始的算法實現在最壞的情況下需要進行O(n^2)的比較和交換。V. Pratt的書對算法進行了少量修改,可以使得性能提升至O(n(logn)^2)。這比最好的比較算法的O(n log n)要差一些。

希爾排序通過將待排序序列按步長劃分成幾個序列來提高插入排序的性能,經過劃分,使得在排序時,每次一個元素可以一次性的朝其最終位置前進一大步,而不是插入排序中的每次一步。在一趟排序後,再把步長減小,按新的步長重新劃分剛得到的新序列,然後再對劃分的各序列進行插入排序。如此往復,直到步長減小到1,就可以得到最終所求的有序序列了。

例如對輸入數組[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],初始步長取5,即每隔5個元素取一個元素構造子序列,則可劃分成

13 25 45 10

14 59 27

94 94 73

33 65 25

82 23 39

對每個子序列應用插入排序,得到

10 13 25 45

14 27 59

73 94 94

25 33 65

23 39 82

然後將上面幾個子序列按列拼接起來,得到[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ]。

然後將步長減小爲3,重新劃分,得到下面的子序列

10 25 27 39 94 45

14 23 94 25 65

73 13 33 59 82

對各子序列應用插入排序,得到

10 25 27 39 45

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章