void ShellSort(Sqlist &L, int dlta[], int t)
{
//按增量序列dlta[0...t-1]对顺序表L作希尔排序
int k;
for (k = 0; k < t; ++k)
{
ShellInsert(L, dlta[k]);//一趟增量为dlta[k]的插入排序
}
}//ShellSort
每一步进行的操作
void ShellInsert(Sqlist &L, int dk)
{//对顺序表L进行一趟增量为dk的Shell排序,dk为步长因子
int i, j;
for (i = dk + 1; i <= L->length; i=i+dk)
{
if (L->r[i].key < L->r[i - dk].key)
{
L->r[0] = L->r[i];
for (j = i - dk; j>0 && (L->r[0].key < L->r[j].key); j = j - dk)
L->r[j + dk] = L->r[j];
L->r[j + dk] = L->r[0];
}
}
}
void HeapAdjust(elem R[], int s, int m)
{//R[s...m]中的关键字除了R[s]外均满足堆定义,本函数调整R[s]的关键字,使R[s...m]成为一个小根堆
int rc,j;
rc = R[s];
for (j = 2 * s; j <= m; j *= 2)//沿key较小的孩子结点向下筛选
{
if (j<m&&R[j]>R[j + 1])++j;//j为key较小的记录下标
if (rc <= R[j])break;
R[s] = R[j]; s = j;//rc应插入在s位置
}//for
R[s] = rc;//插入
}//HeapAdjust