上文我們提到插入排序對有序序列效能很高,在最後一節優化的部分,也提到了,如果能對序列先做些處理,使其區域性有序,從而可以很大程度上提高插入排序的效能.希爾排序就是基於這一思路擴充套件而來。我們還發現,插入排序還有乙個問題就是交換次數太多,他是從右至左逐個比較,逐個交換,對於倒序序列,效能最差。希爾排序改進了這種操作,對於給定的任意陣列
從邏輯上進行重新分組,使其成為跨度較大的小陣列
比如,我們以步長h= n/2為例(當然步長可以任意n/3,n/4都
可以),陣列在邏輯上則會標記成如下的樣子
也就是形成了像[1,4],[8,3][7,2],[6,9],[5,0]這樣的小陣列,注意,這些小陣列是邏輯上的,不會建立這樣的新陣列。對於以上每個小陣列進行插入排序,
即可得[1,4],[3,8][2,7],[6,9],[0,5]這樣的有序陣列。這樣的乙個顯而易見的好處是陣列交換不再是一步一步的了,
而是「大跨步」交換。這大大減少了交換次數。
演算法執行過程如下
① 步長h=10/2 =5
陣列分組
資料排序
② 步長h=5/2 =2
資料分組
排序陣列
③ 步長h=2/2=1 這與插入性質完全相同了,這裡不做贅述。
1) 程式片段
2) 執行過程
這裡列印了前兩步的執行結果與最後一步的全部結果,我們可以明顯的看出來經過前兩次的資料處理,最後一步排序效果非常好。
希爾排序是唯一乙個沒法給出準確時間複雜度的演算法,不過我們可以大概的看出,他的效能肯定要好於插入排序(廢話,要不不是白優化了)。
總的來說,希爾排序的效能還算可以,如果沒有其他合適的演算法,可以先用希爾排序頂著,有了合適的演算法再置換。希爾排序的另乙個價值在於,給出了一種優化演算法的思路:先做些預處理,以提供給合適的演算法繼續使用,從而增強整體效能。
插入排序 希爾插入排序
本文借鑑於lsgo實驗室創始人馬老師 演算法 希爾插入排序 delta len nums 2 while delta 0 shell delta,nums delta delta 2return nums defshell delta,key for i in range delta,len key...
插入排序 希爾排序
我們知道當乙個序列基本有序時,直接插入會變得很高效。因為此時只需少量的移動元素,操作集中在元素的比較上。基於這種想法,我們就試圖把乙個序列在進行直接插入前調整得盡量有序。這就是希爾排序 shell sort 的核心思路。shell只是演算法發明者的名字,無特殊含義 那到底該怎麼做呢?希爾排序一反以前...
插入排序 希爾排序
希爾排序 先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄 基本有序 時,再對全體記錄進行依次直接插入排序。以n 10的乙個陣列49,38,65,97,26,13,27,49,55,4為例 第一次 gap 10 2 5 4938 6597 2613 2749554 ...