八大排序算法之二希尔排序(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 plain copy
  1. #include  
  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
  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<' ';  
  38.     }  
  39.     system("pause");  
  40. }  

你可能感兴趣的:(数据结构与算法)