希尔排序的代码如下:
/* 对顺序表L作希尔排序 */
void ShellSort(SqList *L)
{
int i,j;
int increment = L->length;
do
{
increment = increment/3+1; //增量序列
for(i=increment+1; i<=L->length;i++)
{
if (L->r[i]<L->[i-increment])
{ //需将L->r[i]插入有序增量子表
L->r[0] = L->r[i]; //暂存在L->r[0]
for(j=i-increment;j>0 && L->r[0]<L->r[j];j-=increment)
L->r[j+increment] = L->r[j]; //记录后移,查找插入位置
L->r[j+increment]=L->r[0]; //插入
}
}
}
while(increment>1);
}
希尔排序的关键在于将相隔某个“增量”的记录组成一个子序列,实现跳跃式的移动,使得排序的效率提高。增量序列的最后一个增量值必须等于1才行。另外由于记录是跳跃式的移动,希尔排序并不是一种稳定的排序算法。