希尔排序法
希尔排序法是针对于直接插入法的优化。
希尔排序里面有一个增量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 循环,但是 时间复杂度