直接插入排序对待排数量较少且基本有序的序列,其执行效率是非常高的,希尔排序正是利用了这点,将一个无序的序列拆分成几个子组,然后对几个子组分别进行插入排序。
注意,这儿的分组并不是简单的{a1,a2,a3,b1,b2,b3,c1,c2,c3}(相同字母为一组),而是进行{a1,b1,c1,a2,b2,c2,a3,b3,c3},因为我们一次分组排序的目的是将各个子组中较小的放到整个序列前面,较大的放到整个序列后面,以形成基本有序,然后减少分组数量{a1,b1,a2,b2,a3,b3,a4,b4,a5},继续对每个子组进行插入排序,使序列更加基本有序,直到分组数量等于整个序列长度。
在实际中,我们用增量increment逐渐减小表示分组数量逐渐减少,而且increment成倍减少,
于是可以写出以下代码:
void ShellSort (int n, int *array)
{
int i, j;
int increment;
for (increment=n/3; increment > 0; increment /= 3)
{
for (i=0; i<increment; i++) /*下面对一组序列进行插入排序*/
{
for (j=i+increment; j<n; j+=increment)
{
if (array[j] < array[j-increment])
{
int key = array[j];
int k;
for (k=j-increment; k>=0 && array[k]>key; k -= increment)
{
array[k+increment] = array[k];
}
array[k+increment] = key;
}
}
}
}
}
时间: 2024-11-04 04:38:12