//对顺序表L做一趟希尔插入排序。
//本算法是和一趟直接插入排序相比,做了如下修改:
//1、前后记录位置的增量是dk,而不是1;
//2、r[0]只是暂存单元,不是哨兵。当j<=0时,插入位置已找到。
void ShellInsert(SqList &L, int dk) {
for(int i=dk+1; i<=L.length; ++i) {
if(L.r[i].key < L.r[i-dk].key) {//需将 L.r[i] 插入有序增量子表
L.r[0] = L.r[i];//暂存在 L.r[0]
int j;
for(j=i-dk; j>0 && (L.r[0].key < L.r[j].key); j-=dk) {
L.r[j+dk] = L.r[j];//记录后移,查找插入位置
}
L.r[j+dk] = L.r[0];//插入
}
}
}
//按增量序列 dlta[0 .. t-1]对顺序表L做希尔排序
//SqList &L
//int dlta[] 增量序列
//int t 排序趟数
void ShellSort(SqList &L, int dlta[], int t) {
for(int k=0; k<t; ++t){
ShellInsert(L, dlta[k]);//一趟增量为dlta[k]的插入排序
}
}
希尔排序的增量及趟数怎么确定?怎么调用?有点蒙啊?