希尔排序法

希尔排序法是针对于直接插入法的优化。

希尔排序里面有一个增量d,最后一个增量值必须等于1 ,

下面是两种实现方法:

 1 void shellsort(int *L , int n)
 2 {
 3     int i = 0 ,j = 0,k = 0,d = 0;
 4 
 5     //for(d =n ; d>=1 ; d = d/3+1) // 这样子会陷入死循环
 6     for(d =n/2 ; d>0 ; d = d/2)
 7     {
 8         for(i =0 ;i < n-d ; i = i++)
 9         {
10             if(L[i]  > L[i+d])
11             {
12                 int temp = L[i+d];
13                 for(j = i ; j>= 0 && L[j] > temp ; j = j-d)
14                 {
15                     L[j+d] = L[j];
16                     k = j;
17                 }
18                 L[k] = temp;
19             }
20         }
21     }
22 }

 

 

 1 void shellsort02(int *L , int n)
 2 {
 3     int i  ,j ,d ;
 4 
 5     //for(d =n ; d>1 ; d = d/3+1)
 6     d = n;
 7     do
 8     {
 9         d= d/3+1;
10 
11         for(i =0 ;i < n-d ; i = i+1)
12         {
13             if( L[i]  > L[i+d] )
14             {
15                 int k = 0;
16                 int temp = L[i+d];
17                 for(j = i ; j >=0  && L[j] > temp ; j = j-d)//出了很多错误,这里开始设定的是j > 0,而出错。
18                     //这里的i  从零开始,却让j 大于零,这本身就不对。
19                 {
20                     L[j+d] = L[j];
21                     k = j;
22                 }
23                 L[k] = temp;
24             }
25         }
26     }
27     while(d > 1);
28 }

程序里面的增量,最好的一种情况,大家一致在寻找,但是现阶段d = d/3+1 是比较好的。

 

里面虽然有三个for 循环,但是 时间复杂度

 

posted @ 2018-01-27 20:40  小陈同学啦  阅读(209)  评论(0编辑  收藏  举报