希尔排序

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

原理

插入排序的改进版,是基于插入排序的以下2点性质而提出的改进方法:

插入排序对几乎已排好序的数据操作时,效率很高,可以达到线性排序的效率。但插入排序在每次往前插入时只能将数据移动一位,效率比较低。
所以希尔排序的思想是:

先是取一个合适的gap<n作为间隔,将全部元素分为gap个子序列,所有距离为gap的元素放入同一个子序列,再对每个子序列进行直接插入排序;
缩小间隔gap,例如去gap=ceil(gap/2),重复上述子序列划分和排序直到,最后gap=1时,将所有元素放在同一个序列中进行插入排序为止。

性能

开始时,gap取值较大,子序列中的元素较少,排序速度快,克服了直接插入排序的缺点;
其次,gap值逐渐变小后,虽然子序列的元素逐渐变多,但大多元素已基本有序,所以继承了直接插入排序的优点,能以近线性的速度排好序。

python实现

1
2
3
4
arr = [3, 5, 2, 6, 14, 9, 7, 1, 6]
def shell_sort(arr):
pass