希尔排序(缩小增量排序)
基本思想:将一个无序的序列按某个步长(或称增量)向量dk=[d1,d2,d3,…,dk] (其中dk=1,di>dj when i<j)分别去做直接插入排序
关键点:1、步长向量的选择没有公约数,互质最好;
2、k趟排序,每一趟为步长为dk的直接插入排序;
3、最后一趟的步长dk必须为1;
C代码实现如下:
/*步长为dk的直接插入排序算法*/
void ShellInsertSort(int a[],int dk,int len)
{
int i,pos;
int temp;
for(pos=dk;pos<len;pos++)
{
if(a[pos]<a[pos-dk])
{
i = pos;
temp = a[i];
while(i>=dk && temp<a[i-dk])//边界条件判断
{
a[i] = a[i-dk];//当前记录后并留空当前位置
i -= dk;
}
a[i] = temp;//插入
}
}
}
void ShellSort(int a[],int len)
{
int i=0;
int dkVector[] = {d1,d2,…,dk}//dk=1
while(i<=k)
{
ShellInsertSort(a,dkVector[i],len);
i++;
}
}