選擇乙個增量序列t1,t2,…,tk,其中ti>tj,tk=1;
按增量序列個數k,對序列進行k 趟排序;
每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子串行,分別對各子表進行直接插入排序。僅增量因子為1 時,整個序列作為乙個表來處理,表長度即為整個序列的長度。
希爾排序是插入排序改良的演算法,希爾排序步長從大到小調整,第一次迴圈後面元素逐個和前面元素按間隔步長進行比較並交換,直至步長為1,步長選擇是關鍵。
直接上圖比較好懂:
如果還沒懂,看一下**演示:
#j是需要比較的次數
for j in
range
(gap,n)
:#3,4,5
#i是需要控制的索引
i=jwhile
(i-gap)
>=
0and s[i]
:#交換
s[i]
,s[i-gap]
=s[i-gap]
,s[i]
#修改i
i-=gap
#控制間隙變化
gap//=
2return ss=[
2,8,
9,1,
3]shell_sort(s)
最佳情況:t(n) = o(nlog2 n) 最壞情況:t(n) = o(nlog2 n) 平均情況:t(n) =o(nlog2n) 不穩
插入排序 希爾插入排序
本文借鑑於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 ...