排序算法之希尔排序

来源:互联网 发布:青年网络公开课 编辑:程序博客网 时间:2024/05/02 01:58

希尔排序实际上是一种分治思想的插入排序。

插入排序不说了,不清楚看这里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 3void 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,而是dkvoid 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;}}