希爾排序又叫縮小增量排序,希爾排序是1959 年由d.l.shell 提出來的,相對直接排序有較大的改進。
基本思想:
先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄「基本有序」時,再對全體記錄進行依次直接插入排序。
基本操作如下:
第一步:選擇乙個增量序列t1,t2,…,tk,其中ti>tj,tk=1;
第二步:按增量序列個數k,對序列進行k 趟排序;
第三步:每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子串行,分別對各子表進行直接插入排序。
僅增量因子為1 時,整個序列作為乙個表來處理,表長度即為整個序列的長度。
演算法文字描述如下:
增量序列d = n
為要排序數的個數。
即:先將要排序的一組記錄按某個增量d
(n/2,n
為要排序數的個數)分成若干組子串行,每組中記錄的下標相差
d.對每組中全部元素進行直接插入排序,
然後再用乙個較小的增量(
d/2)對它進行分組,在每組中再進行直接插入排序。繼續不斷縮小增量直至為1
,最後使用直接插入排序完成排序。
void print(int a, int n ,int i)
} int main();
shellsort(a,8); //希爾插入排序
print(a,8,8);
}
注意:
希爾排序時效分析很難,關鍵碼的比較次數與記錄移動次數依賴於增量因子序列d的選取,特定情況下可以準確估算出關鍵碼的比較次數和記錄的移動次數。目前還沒有人給出選取最好的增量因子序列的方法。增量因子序列可以有各種取法,有取奇數的,也有取質數的,但需要注意:增量因子
中除1 外沒有公因子,且最後乙個增量因子
必須為1。希爾排序方法是乙個不穩定的排序方法。
演算法例項展示:
,歡迎交流~~
插入排序 希爾插入排序
本文借鑑於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 ...