排序算法之希尔排序
希尔排序实际上是一种分治思想的插入排序。
插入排序不说了,不清楚看这里http://blog.csdn.net/zfx0906/article/details/6845566
分治思想,对增量为dk,dk递减,开始很多小序列,最后为一个大序列
相对直接插入排序,在希尔排序中,只不过增量不是1,而是dk
较好的增量序列是2^k-1,2^(k-1)-1,.....7,3,1,这样可使Shell排序时间复杂度达到O(N^1.5)(参考《希尔排序最佳增量序列研究》)
while((dlta+1)*2<length)
dlta=(dlta+1)*2-1;//计算出最大增量序列数
。。。
ShellInsert(L,length,dlta);// 算法是直接插入排序,只不过增量不是1,而是dlta
dlta=(dlta+1)/2-1;//增量递减
——————————————代码分界线———————————————————————————
//分治思想+插入排序, //对增量为dk,dk递减,开始很多小序列,最后为一个大序列 //插入排序,只不过增量不是1,而是dk //希尔排序实际上是一种分治思想的插入排序 #include<stdio.h> #define Length 10 #define dLength 3 void ShellSort(int*,int); void ShellInsert(int*,int,int); int main() { int L[Length]; int dlta[dLength]={5,3,1}; int i; printf("请分别输入%d个整数:\n",Length); for(i=0;i<Length;i++) { printf("\n请输入第%d个整数:",i+1); scanf("%d",&L[i]); } printf("\n排序前:"); for(i=0;i<Length;i++) { printf("%5d",L[i]); } ShellSort(L,Length); printf("\n排序后:"); for(i=0;i<Length;i++) { printf("%5d",L[i]); } printf("\n"); getchar(); getchar(); } //对增量为dk时进行插入排序 //算法是直接插入排序,只不过增量不是1,而是dk void ShellInsert(int*L,int length,int dlta) { int i,j; int temp; for(i=dlta;i<length;i++) if(L[i]<L[i-dlta]){ temp=L[i]; for(j=i-dlta;j>=0&&L[j]>temp;j-=dlta) L[j+dlta]=L[j]; L[j+dlta]=temp; } } //希尔排序算法 //时间复杂度约为O(n^1.5),在选择其它增量序列的条件下,可至下限O(nlogn) //希尔排序是一种使用分治法的插入排序 void ShellSort(int*L,int length) { int i; int dlta = 1; while((dlta+1)*2 <length) { dlta=(dlta+1)*2-1; } while(dlta>0) { ShellInsert(L,length,dlta); dlta = (dlta+1)/2-1; } }