希尔排序实际上是一种分治思想的插入排序。
插入排序不说了,不清楚看这里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;
}
}