基本思想
1、将整个待排序记录分割成若干个子序列,
2、在子序列内分别进行直接插入排序,
3、待整个序列中的记录基本有序时,对全体记录进行直接插入排序。
关键问题
1、分割待排序记录的目的是:1、减少待排序记录数目。2、使序列向基本有序发展。
2、如何分割? 子序列的构成不能是简单地“逐段分割”,而是将相距某个“增量”的记录组成一个子序列。
(1)分割解决方法:
将相隔某个“增量”的记录组成一个子序列。
增量应如何取?
希尔最早提出的方法是d1=n/2,di+1=di/2。
算法描述:
for (d=n/2; d>=1; d=d/2)
{
以d为增量,进行组内直接插入排序;
}
具体实现
void Shellsort(int r[],int n){
for (d=n/2; d>=1; d=d/2){ //设定初始的“增量d”为n/2
for (i=d+1; i<=n; i++) { //前d个数是一个子序列,则从第二个子序列开始对应比较
r[0]=r[i]; //暂存待插入记录
j=i-d; //变量j存待插记录前一个子序列相对应的比较位置。
while (j>0 && r[0]<r[j]) //j从最后一个序列向前比较
{
r[j+d]=r[j]; //如果小于前面的序列,前面的序列后移d个位置
j=j-d; //j减小d,继续向前面的前面序列比较
}
r[j+d]=r[0]; //比较完成后,j+d是最后的插入位置。
}
}
}
来源:CSDN
作者:2018417
链接:https://blog.csdn.net/qq_43628835/article/details/103704849