排序算法-03希尔排序(python实现)
生活随笔
收集整理的這篇文章主要介紹了
排序算法-03希尔排序(python实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
希爾排序
- 簡述
- 希爾排序又稱之為縮小增量排序,從思維導圖(冒泡排序的博客)可以得知,這也是一種插入排序,事實上,它就是直接插入排序的加強優化版本。
- 過程描述
- 下面的敘述按照維基百科的例子來解釋,有一個數據序列為[13, 14, 94, 33, 82, 25, 59, 94, 65, 23, 45, 27, 73, 25, 39, 10]。
- 首先,設定一個步長5,進行排序。
- 此時序列為4行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] - 排序后序列為[10, 14, 73, 25, 23, 13, 27, 94, 33, 39, 25, 59, 94, 65, 82, 45]
- 接著,再以3為步長進行排序。
- 此時序列為5行3列:
- [10, 14, 73,
?25, 23, 13,?
?27, 94, 33,?
?39, 25, 59,?
?94, 65, 82,?
?45] - 對每一列進行排序。
- [10, 14, 13,
?25, 23, 33,?
?27, 25, 59,?
?39, 65, 73,?
?45, 94, 82,?
?94]
- 最后,以1為步長進行排序,此時就是一個直接插入排序了。
- 不難發現,步長的選擇是希爾排序的重要部分,Donald Shell(算法提出者)建議使用序列長度的一半作為初始步長(也就是N/2)并不斷取半直到到達1,盡管還有優化的余地,這里就不介紹了。
- 算法最開始以一定的步長進行排序,然后會繼續以更小的步長進行排序,最終算法一定是以步長為1進行排序。當步長為 1 時,算法變為直接插入排序,這就保證了數據一定會被全部排序。
-
復雜度
排序名稱最好情況最壞情況平均情況 希爾排序 ? O(n^2) O(nlogn) - 特點
- 希爾排序有效減少了排序的趟數,因為不斷使得序列基本有序,在上一篇直接插入排序中我提到,序列本身越是有序,排序效率越高,經過之前的步長處理,最后一趟直接插入排序是很高效的。
- 希爾排序低步長排序結果在高步長狀態下依然有序。
- 步長序列的不同直接導致了算法復雜度變化。
- 希爾排序相同數據有可能交換位置,是不穩定的,之前的直接插入是穩定的。同時,直接插入對鏈式存儲數據也合適,但是,由于二維數據變換,希爾排序是不能的。
具體可以查看我的github。
總結
以上是生活随笔為你收集整理的排序算法-03希尔排序(python实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据分析与挖掘理论-数据探索
- 下一篇: 排序算法-04快速排序(Python实现