數據結構:希爾排序


希爾排序(Shell Sort)是插入排序的一種,它是針對直接插入排序算法的改進。該方法又稱縮小增量排序,因DL.Shell於1959年提出而得名。希爾排序實質上是一種分組插入方法。它的基本思想是:對於n個待排序的數列,取一個小於n的整數gap(gap被稱為步長)將待排序元素分成若干個組子序列,所有距離為gap的倍數的記錄放在同一個組中;然后,對各組內的元素進行直接插入排序。 這一趟排序完成之后,每一個組的元素都是有序的。然后減小gap的值,並重復執行上述的分組和排序。重復這樣的操作,當gap=1時,整個數列就是有序的。

 1 void shell_sort1(int a[], int n)
 2 {
 3     int i,j,gap;
 4     // gap為步長,每次減為原來的一半。
 5     for (gap = n / 2; gap > 0; gap /= 2)
 6     {
 7         // 共gap個組,對每一組都執行直接插入排序
 8         for (i = 0 ;i < gap; i++)
 9         {
10             for (j = i + gap; j < n; j += gap) 
11             {
12                 // 如果a[j] < a[j-gap],則尋找a[j]位置,並將后面數據的位置都后移。
13                 if (a[j] < a[j - gap])
14                 {
15                     int tmp = a[j];
16                     int k = j - gap;
17                     while (k >= 0 && a[k] > tmp)
18                     {
19                         a[k + gap] = a[k];
20                         k -= gap;
21                     }
22                     a[k + gap] = tmp;
23                 }
24             }
25         }
26     }
27 }

第一趟:gap=4

 

第二趟:gap=2

 

 第三趟:gap=1

 

 希爾排序代碼實現:

 1 #include <cstdio>
 2 #include <iostream>
 3 using namespace std;
 4 void Shell_sort(int a[],int n)
 5 {
 6     int gap,i,j;
 7     for(gap=n/2;gap>0;gap/=2)
 8     {
 9         for(i=0;i<gap;i++)
10         {
11             for(j=i+gap;j<n;j+=gap)
12             {
13                 if(a[j]<a[j-gap])
14                 {
15                     int temp=a[j];
16                     int k=j-gap;
17                     while(k>=0&&a[k]>temp)
18                     {
19                         a[k+gap]=a[k];
20                         k-=gap;
21                     }
22                     a[k+gap]=temp;
23                 }
24             }
25         }
26     }
27 }
28 int main()
29 {
30     int a[100]={0};
31     int n,t;
32     cin>>t;
33     while(t--)
34     {
35         cin>>n;
36         for(int i=0;i<n;i++) cin>>a[i];
37         Shell_sort(a,n);
38         for(int i=0;i<n;i++) cout<<a[i]<<" ";
39         cout<<endl;
40     }
41     return 0;
42 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM