八大排序算法之二希爾排序(C語言)

希爾排序是一種插入排序法,它出自D.L.Shell,因此而得名。Shell排序又稱作縮小增量排序。

  基本思想:

  不斷把待排序的對象分成若干個小組,對同一小組內的對象採用直接插入法排序,當完成了所有對象都分在一個組內的排序後,排序過程結束。每次比較指定間距的兩個數據項,若左邊的值小於右邊的值,則交換它們的位置。間距d按給定公式減少: di+1 =(di +1)/2 ,直到d等於1爲止。D可以選取{9,5,3,2,1}。

操作方法:

  1. 選擇一個增量序列t1,t2,…,tk,其中ti>tj,tk=1;
  2. 按增量序列個數k,對序列進行k 趟排序;
  3. 每趟排序,根據對應的增量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=====================================

 

[c-sharp] view plaincopy
  1. #include<iostream>  
  2. using namespace std;  
  3.    
  4. void shell(int *work,int n)  
  5. {  
  6. int i,j,x,d;  
  7. d= n / 2;  
  8. while (d>=1)  
  9. {  
  10.   for (i=d+1;i<=n;i++)  
  11.   {  
  12.     x=work[i];  
  13.     j=i-d;  
  14.     while ((j>0) && (x<work[j]))  
  15.     {  
  16.     work[j+d]=work[j];  
  17.     j-=d;  
  18.     }  
  19.     work[j+d]=x;  
  20.   }  
  21.   d /= 2;  
  22. }  
  23. }  
  24. int main(){  
  25.     int a[100],b,c,n,i;  
  26.     cout<<"請輸入需排序的數字個數:";  
  27.     cin>>n;  
  28.     cout<<"請輸入需排序的數字";  
  29.     for (i=1;i<=n;i++)  
  30.     {  
  31.         cin>>a[i];  
  32.     }  
  33.     shell(a,n);    
  34.     cout<<"從小到大排序結果爲:";  
  35.     for (i=1;i<=n;i++)  
  36.     {  
  37.         cout<<a[i]<<' ';  
  38.     }  
  39.     system("pause");  
  40. }  

發佈了24 篇原創文章 · 獲贊 11 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章