希尔排序主要分两步:
1. 间隔h的选择
方法一:
for(int dk=n/2;dk>=1;dk/=2)
....
方法二:
int dk=1;
while(dk< n/3)
dk=dk*3+1;
...
while(dk>=1){
...
dk/=3;
}
2. 主体部分
void ShellSort (ElemType A[],int n){
//对顺序表作希尔插入排序,本算法和直接插入排序相比,作了以下修改:
//1.前后记录位置的增量是dk,不是1
//2.r[0]只是暂存单元,不是哨兵,当j<=0时,插入位置已到
for(dk=n/2;dk>=1;dk=dk/2) //初始增量为总长度的一半,之后依次除2且向下取整
for(i=dk+1;i<=n;++i)
if(A[i].key<A[i-dk].key){ //A[i].key是待插入的关键字,i-dk之前的都是有序的,如
//果待插入的比有序序列最后一个小, 则需要进行排序(进入if
//语句块),如果大则不需要(跳出if语句块)
A[0]=A[i]; //暂存在A[0]
for(j=i-dk;j>0&&A[0].key<A[j].key;j-=dk)
A[j+dk]=A[j];
A[j+dk]=A[0];
}
}