希爾排序是希爾(donald shell)於2023年提出的一種排序演算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進之後的乙個更高效的版本,也稱為縮小增量排序。
首先我們知道直接插入排序的時間複雜度最低的時候應該是序列基本有序,效率最高,在待排序的記錄個數較少時,效率較高。基於這個基礎理論,希爾排序的基本思想如下:
先將整個待排記錄序列分割成若干子串行,分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行一次直接插入排序。技巧:
子串行的構成不是簡單地「逐段分割」
將相隔某個增量dk的記錄組成乙個子串行
讓增量dk逐趟縮短(例如依次取5,3,1)
直到dk=1為止。
優點:
小元素跳躍式前移
最後一趟增量為1時,序列已基本有序
平均效能優於直接插入排序
如何選擇最佳d序列,目前尚未解決最後乙個增量值必須為1,無除1以外的公因子
不宜在鏈式儲存結構上實現
這部分參考 主要是圖畫的特別好我們來看下希爾排序的基本步驟,在此我們選擇增量gap=length/2,縮小增量繼續以gap = gap/2的方式,這種增量選擇我們可以用乙個序列來表示,,稱為增量序列。希爾排序的增量序列的選擇與證明是個數學難題,我們選擇的這個增量序列是比較常用的,也是希爾建議的增量,稱為希爾增量,但其實這個增量序列不是最優的。此處我們做示例使用希爾增量。
參考:
經典排序之希爾排序
希爾排序 基本思想 將待排序的序列分為若干組,在每組內進行直接插入排序,以使整個序列基本有序,然後再對整個序列進行直接插入排序。該方法實質上是一種分組插入方法。具體來說,先取乙個小於n的整數d1作為增量,把檔案的全部記錄分組。所有距離為d1的倍數的記錄放在同乙個組中。現在各組內進行直接插入排序 然後...
經典排序演算法之希爾排序
前面的直接插入演算法,以抓牌為例,假設手氣比較好,抓牌的順序是從a直到k,那麼在這整個過程中都無需進行任何的插入動作,只需要將每次抓到的牌放在最後即可。假設現在手上已經抓到的牌的順序中逆序比較少,則抓牌的過程中插入操作就越少。因此,對於基本有序的序列排序,直接插入排序的效能是比較好的。這裡的基本有序...
經典排序 希爾排序
感謝太原理工大學的演算法演示 在希爾排序中主要是要明白在最底層是通過一次又一次的插入排序來實現的。每次都看成是h k 個獨立的陣列,進行插入排序,然後迴圈h k 1 h k 2 h 1 如下 如果gap 1 那就是最後的插入排序了,不明白插入排序可以看我的插入排序 1 public static v...