希爾排序又稱為「縮小增量排序」,是由希爾在2023年提出的。希爾排序是對插入排序的一種改進,在效率上較直接插入,冒泡,選擇排序方法有較大改進。
基本思想:設定乙個元素間隔增量gap,將參加排序的序列按這個間隔數gap從第1個元素開始依次分成若干個子串行。例如最開始gap=3,下面的序列可這樣劃分:
原序列:
子串行1:3——2
子串行2: 6——11
子串行3: 4——10
將序列劃分為3個子序列。在子串行中採用其他排序方法(例如氣泡排序)。然後縮小增量gap進行劃分,再分別對每個子串行進行排序。如此將「縮小增量gap–劃分序列–將每個子串行排序」操作進行下去,直到間隔數增量gap=1為止。
由於排序時每一趟都是以不同的間隔對子序列進行排序,因此元素的移動在子串行中是跳躍的。間隔數gap越大,跳躍的跨度就越大。一般情況下,當增量gap縮小到1時,序列大都已經按值有序,不需要進行較多的元素移動就能達到排序的目的。
上述的元素序列的希爾排序如下:
初始狀態:
第1趟排序,gap=4:
第2趟排序,gap=2:
第3趟排序,gap=1:
希爾排序的演算法描述如下:
void sort(keytype k,int n)
}}while(flag!=0);
}}
上述演算法描述希爾排序的過程。引數n為序列中元素的個數。將n賦值給變數gap,當gap>1時,迴圈地執行希爾排序的每一趟排序操作。在執行每一趟排序操作之前,gap的值都要減半,增量減小。在每趟的排序中使用的是氣泡排序,當然這裡也可以使用其他的排序方法。
希爾排序演算法的速度是一系列增量gap的函式,要對希爾排序的做法做出準確的分析並不容易,如何選取最合適的間隔數序列才能達到最優的排序效果是至今尚未解決的數學難題。
【例項】
編寫乙個c程式,實現資料序列的希爾排序,要求從大到小,並輸出排序後的數列元素。
【分析】
本序列中包含10個元素,因此間隔數gap的初始值為10/2=5。以後在進行每一趟排序之前,gap的值都要減半,直到gap=1為止。在這裡要注意,本題要求將序列從大到小排列,因此要將每一趟的排序方法(上述演算法中採用的是氣泡排序法)作適當的調整。
#includevoid sort(int k,int n)
}}while(flag!=0);
}}main()
; //初始化序列,a[0]可任意置數
printf("原序列為:\n");//顯示原序列之中的元素
for(i=1;i<=10;i++)
printf("%d ",a[i]);
sort(a,10);//執行希爾排序
printf("\n排序後的序列為:\n");
for(i=1;i<=10;i++)
printf("%d ",a[i]); //輸出排序後結果
return 0;
}
排序 希爾排序
希爾排序 shell sort 又稱為縮小增量排序,輸入插入排序演算法,是對直接排序演算法的一種改進。本文介紹希爾排序演算法。對於插入排序演算法來說,如果原來的資料就是有序的,那麼資料就不需要移動,而插入排序演算法的效率主要消耗在資料的移動中。因此可知 如果資料的本身就是有序的或者本身基本有序,那麼...
排序 希爾排序
縮小增量排序 待排序列按關鍵字基本有序時,直接插入排序的效率很高 希爾排序思想 將整個待排記錄分割為若干子串行分別進行直接插入排序,待整個序列中的記錄基本有序時,再對全體記錄進行一次直接插入排序,就可以完成整個排序工作 增量序列中的值沒有除1以外的公因子,且最後乙個增量必須等於1 子串行的構成不是逐...
排序 希爾排序
希爾排序是插入排序中的乙個分支,但是較簡單插入排序又有較大的改進,這使得它成為了歷史上第一批突破二次時間屏障的排序演算法之一哦。它是通過比較一定間隔的元素來工作的。因此希爾排序又稱為縮小增量排序。直接插入排序對於原始資料基本有序的情況下,效率較高。在此的基礎上。我們可以想辦法,使資料基本有序,然後利...