Skip to content

希尔排序 Shell Sort

原理

希尔排序(Shell Sort)是一种基于插入排序的改进排序算法,它通过逐步减少排序的增量(或称间隔)来提升效率。它由计算机科学家 Donald Shell 于 1959 年首次提出,因此得名。

其具体步骤如下:

  1. 分组: 将数组按照一定的间隔分成多个子序列,分别对每个子序列进行插入排序。
  2. 缩小间隔: 每次排序完成后,将间隔逐步缩小(通常按某种递减序列,例如减半或更复杂的公式),重复对子序列排序。
  3. 最终排序: 当间隔缩小到1时,整个数组就成为一个普通的插入排序。

示例

有一组无序数组:

624119031105

取数组长度10的一半并向下取整得到5作为相同序列元素的间隔。

此时有以下几个序列:6 02 34 111 109 5

从前往后对每个序列进行从后往前的插入排序:

  1. 60大,向后移位,已到达数组尽头,将0插入
  1. 32大,3原位插入
  1. 41大,向后移位,已到达数组尽头,将1插入
  1. 1110大,向后移位,已到达数组尽头,将10插入
  1. 95大,向后移位,已到达数组尽头,将5插入

此时间隔为5的数组排序完成。

取上回间隔5的一半并向下取整得到2作为相同序列元素的间隔。

此时有以下几个序列:0 1 5 3 112 10 6 4 9

从前往后对每个序列进行从后往前的插入排序:

  1. 10大,1原位插入
  1. 102大,10原位插入
  1. 51大,5原位插入
  1. 106大,向后移位;62大,将6插入
  1. 53大,向后移位;31大,将3插入

此时间隔为2的数组排序完成。

取上回间隔2的一半并向下取整得到1作为相同序列元素的间隔。

此时仅剩一个序列:0 2 1 6 3 10 5 4 11 9

021641054119

从前往后进行从后往前的插入排序:

  1. 20大,2原位插入
1631054119
  1. 21大,向后移位;10大,将1插入
631054119
  1. 62大,6原位插入
31054119
  1. 63大,向后移位;32大,将3插入
1054119
  1. 106大,10原位插入
54119
  1. 105大,向后移位;65大,向后移位;53大,将5插入
4119
  1. 104大,向后移位;64大,向后移位;54大,向后移位;43大,将4插入
119
  1. 1110大,11原位插入
9
  1. 119大,向后移位;109大,向后移位;96大,将9插入

排序完成。

实现

C++

cpp

可视化

数组长度
动画间隔
数组:
[]