python實現希爾排序演算法
希爾排序是插入排序的一種又稱“縮小增量排序”,是直接插入排序演算法的一種更高效的改進版本。希爾排序是非穩定排序演算法。
希爾排序是把記錄按下標的一定增量分組,對每組使用直接插入排序演算法排序;隨著增量逐漸減少,每組包含的關鍵詞越來越多,當增量減至1時,整個檔案恰被分成一組,演算法便終止。
希爾排序的核心是對步長的理解,步長是進行相對比較的兩個元素之間的距離,隨著步長的減小,相對元素的大小會逐步區分出來並向兩端聚攏,當步長為1的時候,就完成最後一次比較,那麼序列順序就出來了。
如上面例項:第一次排序步長為5,那麼需要比較的元素對為:9-4 1-8 2-6 5-3 7-5,只需要將這幾組元素比比較並交換位置;然後開始第二輪的比較。
def shell_sort(items):
"""
希爾排序
:param items:
:return:
"""
n = len(items)
step = n // 2
while step > 0:
for cur in range(step, n):
i = cur
while i >= step and items[i-step] > items[i]:
items[i - step], items[i] = items[i], items[i-step]
i -= step
step = step // 2
不需要大量的輔助空間,和歸併排序一樣容易實現。希爾排序是基於插入排序的一種演算法,在此演算法基礎之上增加了一個新的特性,提高了效率。希爾排序沒有快速排序演算法快,因此中等大小規模資料排序中表現良好,對規模非常大的資料排序不是最優選擇。
希爾演算法在最壞的情況下和平均情況下執行效率相差不是很多,與此同時快速排序在最壞的情況下執行的效率會非常差,幾乎任何排序工作在開始時都可以用希爾排序,本質上講,希爾排序演算法是直接插入排序演算法的一種改進,減少了其複製的次數,速度要快很多。
相關文章
- 排序演算法:Java實現希爾排序排序演算法Java
- 【演算法】希爾排序的實現演算法排序
- 排序演算法__希爾排序排序演算法
- 【排序演算法】- 希爾排序排序演算法
- PHP 排序演算法之希爾排序PHP排序演算法
- 希爾排序排序
- 排序演算法 - 快速插入排序和希爾排序排序演算法
- python演算法與資料結構-希爾排序(35)Python演算法資料結構排序
- 七、排序,選擇、冒泡、希爾、歸併、快速排序實現排序
- 理解希爾排序排序
- Java希爾排序Java排序
- 希爾排序(一)排序
- 希爾排序(二)排序
- 排序演算法(氣泡排序,選擇排序,插入排序,希爾排序)排序演算法
- Python八大演算法的實現,插入排序、希爾排序、氣泡排序、快速排序、直接選擇排序、堆排序、歸併排序、基數排序。Python演算法排序
- 希爾排序(Shell Sort)排序
- C++希爾排序C++排序
- 希爾排序(C++)排序C++
- 希爾排序——重溫排序(二)排序
- 程式猿修仙之路--演算法之希爾排序演算法排序
- 【譯】Swift演算法俱樂部-希爾排序Swift演算法排序
- 基礎演算法系列 之希爾排序演算法排序
- 【演算法】排序04——程式碼簡約而不簡單的希爾排序(含程式碼實現)演算法排序
- Python 一網打盡<排序演算法>之從希爾排序演算法的分治哲學開始Python排序演算法
- 【排序】插入類排序—(折半)插入排序、希爾排序排序
- 希爾排序使用直接插入排序、二分插入排序的C++程式碼實現演算法排序C++演算法
- 淺解前端必須掌握的演算法(四):希爾排序前端演算法排序
- JavaScript希爾排序簡單介紹JavaScript排序
- rust-algorithms:14-希爾排序RustGo排序
- 第二章 :查詢與排序-------希爾排序排序
- 【小小前端】前端排序演算法第二期(繞人的希爾排序)前端排序演算法
- 五分鐘學會一個高難度演算法:希爾排序演算法排序
- python實現氣泡排序、插入排序以及快速排序演算法Python排序演算法
- 【PHP資料結構】插入類排序:簡單插入、希爾排序PHP資料結構排序
- python實現常用五種排序演算法Python排序演算法
- 三種插入排序 直接插入排序,折半插入排序,希爾排序排序
- 對資料結構和演算法的總結和思考(三)--希爾排序資料結構演算法排序
- (建議收藏)2020最新排序演算法總結:冒泡、選擇、插入、希爾、快速、歸併、堆排序、基數排序排序演算法