希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n^2)的第一批算法之一。
为什么希尔排序算法的效率会比简单插入排序高?如何理解希尔排序的算法思想?要解决这两个问题,需要先理解简单插入排序算法和“跳跃式插入”的含义。
首先我们来看简单插入排序的算法思想:从第2个元素开始,每趟将一个待排序的元素,按其大小插入到前面已排序序列的适当位置上去,直到元素全部插入为止。对应VB 代码如下(之所以写成这种形式是为了避免数组下标越界):
For i = 2 To n
t = a(i): j = i
Do While j > 1
If a(j - 1) > t Then
a(j) = a(j - 1)
j = j - 1
Else
Exit Do
End If
Loop
a(j) = t
Next i
接下来我们再解决一个看似不相干的问题:分别对数组a的奇数和偶数位置的元素进行冒泡排序,即采用“跳跃式冒泡”的方法,每次跳跃的步长为2,将数组分成2个子序列,分别对这2个子序列进行排序。
例如,考虑对数组a = [6, 3, 5, 4, 1, 2, 8, 7]进行跳跃式冒泡排序,排序后的数组a = [1, 2, 5, 3, 6, 4, 8, 7]。
对应代码如下:
For i = 1 To (n - 1) \ 2 '冒泡趟数
For j = n To i * 2 + 1 Step -1
If a(j) < a(j - 2) Then '跳跃式交换,跳跃距离为2
t = a(j): a(j) = a(j - 2): a(j - 2) = t
End If