[toc]

希尔排序

希尔排序 ( Shell Sort ) 是插入排序的一种. 也称缩小量排序., 是直接插入排序算法的一种更高效的改进版本. 希尔排序是非稳定排序算法. 该方法因 DL. Shell 于 1959 年提出而得名. 希尔排序是把记录按下标的一定增量分组, 对每组使用直接插入排序算法排序.随着增量逐渐减少,每组包含的关键词越来越多, 当增量减至 1 时, 整个文件恰好被分成一组, 算法便终止.

希尔排序过程

希尔排序的基本思想是: 将数组列在一个表中并对列分别进行插入排序. 重复这过程, 不过每次用更长的列 ( 步长更长了, 列数更少了 ) 来进行. 最后整个表就只有一列了. 将数组转换至列表是为了更好地理解这算法, 算法的本身还是使用数组进行排序. 

列如, 假设有这样一组数 [ 13, 14, 94, 33, 82, 25, 59, 94, 65, 23, 45, 27, 73, 25, 39, 10 ], 如果我们以步长为 5 开始进行排序, 我们可以通过将这列表放在有 5 列的表中来更好地描述算法. 这样他们就应该看起来是这样 ( 竖着的元素是步长组成 ): 

数据结构 第五节 第五课_时间复杂度

然后我们对每列进行排序:

数据结构 第五节 第五课_时间复杂度_02

将上述四行数字, 依序接在一起时我们得到: [ 10, 14, 73, 25, 23, 13, 27, 94, 33, 39, 25, 59, 94, 65, 82, 45 ]. 这时 10 已经移至正确位置了, 然后再以 3 为步长进行排序:

数据结构 第五节 第五课_时间复杂度_03

排序之后变为:

数据结构 第五节 第五课_插入排序_04

最后 1 步长进行排序 ( 此时就是最简单的插入排序了 )

希尔排序的分析

数据结构 第五节 第五课_时间复杂度_05

代码实现:

数据结构 第五节 第五课_时间复杂度_06

测试代码:

数据结构 第五节 第五课_时间复杂度_07

执行结果:

数据结构 第五节 第五课_插入排序_08

时间复杂度:

最优时间复杂度: 根据步长序列的不同而不同

最坏时间复杂度: O(n^2)

稳定性: 不稳定

希尔排序演示:

数据结构 第五节 第五课_时间复杂度_09