希尔排序(Shell Sort)又叫做缩小增量排序(diminishing increment sort),是一种很优秀的排序法,算法本身不难理解,也很容易实现,而且它的速度很快。
插入排序(Insertion Sort)的一个重要的特点是,如果原始数据的大部分元素已经排序,那么插入排序的速度很快(因为需要移动的元素很少)。从这个事实我们可以想到,如果原始数据只有很少元素,那么排序的速度也很快。
希尔排序就是基于这两点对插入排序作出了改进。
增量数列的选择对希尔排序的性能有着极大的影响。[Mark Allen Weiss]指出,最好的增量序列是 Sedgewick提出的 (1, 5, 19, 41, 109,...),该序列的项来自 9 * 4^i - 9 * 2^i + 1 和 4^i - 3 * 2^i + 1 这两个算式。
下面是一个使用 Sedgewick增量 的希尔排序的完整C语言程序:
在Linux下可以这样测试程序的运行时间:
$ time ./a.out >/dev/null
real 0m2.603s
user 0m2.549s
sys 0m0.019s
上面是在我的机器里,把 MAX 设定为 1000000 时的运行时间。
Sedgewick增量可用像下面那样的程序求得。
/* 计算 Sedgewick增量 的程序 */
由于用了 math.h,用 GCC 编译时注意要加上 -lm 参数。
$ gcc -Wall sedgewick.c -lm