希爾排序是一種插入排序法,它出自D.L.Shell,因此而得名。Shell排序又稱作縮小增量排序。
基本思想:
不斷把待排序的對象分成若干個小組,對同一小組內的對象採用直接插入法排序,當完成了所有對象都分在一個組內的排序後,排序過程結束。每次比較指定間距的兩個數據項,若左邊的值小於右邊的值,則交換它們的位置。間距d按給定公式減少: di+1 =(di +1)/2 ,直到d等於1爲止。D可以選取{9,5,3,2,1}。
操作方法:
- 選擇一個增量序列t1,t2,…,tk,其中ti>tj,tk=1;
- 按增量序列個數k,對序列進行k 趟排序;
- 每趟排序,根據對應的增量ti,將待排序列分割成若干長度爲m 的子序列,分別對各子表進行直接插入排序。僅增量因子爲1 時,整個序列作爲一個表來處理,表長度即爲整個序列的長度。
希爾排序的示例:
算法步驟:
Step1 將n個元素個數列分爲5個小組,在每個小組內按直接插入法排序;
step2 在第i步,分組個數取 di+1 =(di +1)/2 {9,5,3,2,1};相臨兩組之間的對應元素進行比較,如果ai>aj,則交換它們的位置;
Step3 當dK = 1的循環過程完成後,排序過程結束。
希爾排序舉例:設有字符數列"f d a c b e",執行Shell排序:
SHELL排序算法的描述:
算法討論:
Shell排序算法的時間複雜度分析比較複雜,實際所需的時間取決於各次排序時增量的個數和增量的取值。研究證明,若增量的取值比較合理,Shell排序算法的時間複雜度約爲O(n(ldn)2)。由於Shell排序算法是按增量分組進行的排序,所以Shell排序算法是一種不穩定的排序算法。
=====================================My code=====================================
- #include<iostream>
- using namespace std;
- void shell(int *work,int n)
- {
- int i,j,x,d;
- d= n / 2;
- while (d>=1)
- {
- for (i=d+1;i<=n;i++)
- {
- x=work[i];
- j=i-d;
- while ((j>0) && (x<work[j]))
- {
- work[j+d]=work[j];
- j-=d;
- }
- work[j+d]=x;
- }
- d /= 2;
- }
- }
- int main(){
- int a[100],b,c,n,i;
- cout<<"請輸入需排序的數字個數:";
- cin>>n;
- cout<<"請輸入需排序的數字";
- for (i=1;i<=n;i++)
- {
- cin>>a[i];
- }
- shell(a,n);
- cout<<"從小到大排序結果爲:";
- for (i=1;i<=n;i++)
- {
- cout<<a[i]<<' ';
- }
- system("pause");
- }