排序演算法之希爾排序 ShellSort

2021-10-23 15:02:00 字數 1005 閱讀 8868

如果資料序列基本有序,使用插入排序更加有效。

1 核心思想:希爾排序也是一種插入排序,它是簡單插入排序經過改進之後的乙個更高效的版本,也稱為縮小增量排序。

2 演算法分析:

希爾排序是把序列按下標的一定增量分組,對每組使用直接插入排序演算法排序;隨著增量逐漸減少,每組包含的元素越來越多,當增量減至1時,整個序列恰好被分成一組,排序便終止。

如上圖所示,以一組資料 為例,進行直接插入排序的演算法演示:

令步長gap=5,則原陣列分為[9,4],[1,8],[2,6],[3,5],[5,7]五個陣列,分別進行直接插入排序,陣列變為[4,1,2,3,5,9,8,6,5,7]。

令步長gap=2,則原陣列分為[4,2,5,8,5]和[1,3,9,6,7]兩個陣列,分別進行直接插入排序,陣列變為[2,1,4,3,5,6,5,7,8,9]。

令步長gap=1,對陣列進行直接插入排序,完成排序。

#include

void shsort(int s,int n)

{int i,j,d;

d=n/2;

while(d>=1) //確定固定增量值

{for(i=d+1;i<=n;i++) //陣列下標從d+1開始進行直接插入排序

{s[0]=s[i]; //設定監視哨

j=i-d; //確定要比較元素的最右邊位置

while((j>0)&&(s[0]int main()

{int a[11],i;

printf(「請輸入10個資料:\n」);

for(i=1;i<=10;i++)

scanf("%d",&a[i]);

printf(「原始順序:\n」);

for(i=1;i<11;i++)

printf("%5d",a[i]);

shsort(a,10);

printf("\n排序後順序:\n");

for(i=1;i<11;i++)

printf("%5d",a[i]);

printf("\n");

排序演算法之希爾排序

希爾排序實際上是一種分治思想的插入排序。插入排序不說了,不清楚看這裡 分治思想,對增量為dk,dk遞減,開始很多小序列,最後為乙個大序列 相對直接插入排序,在希爾排序中,只不過增量不是1,而是dk 較好的增量序列是2 k 1,2 k 1 1,7,3,1,這樣可使shell排序時間複雜度達到o n 1...

排序演算法之希爾排序

希爾排序 shell sort 又稱為縮小增量排序,輸入插入排序演算法,是對直接排序演算法的一種改進。本文介紹希爾排序演算法。對於插入排序演算法來說,如果原來的資料就是有序的,那麼資料就不需要移動,而插入排序演算法的效率主要消耗在資料的移動中。因此可知 如果資料的本身就是有序的或者本身基本有序,那麼...

排序演算法之希爾排序

希爾排序,突破了 通過交換相鄰元素進行排序的任何演算法平均需要 n 2 的二次時間限制 通過比較相距一定間隔的元素來工作。使用乙個增量序列 h1 1,h2,ht,在使用乙個 增量h的一趟排序後,對於每乙個i滿足pdata i pdata i h 即此時序列是h排序的 各趟 比較所用的距離逐漸減小,直...