一、基本思想
希尔排序是冲破2次时间界的算法之一,它通过比较相距一定间隔的元素来工作,各趟比较所用的距离随着算法的进行而减小,直到仅比较相邻元素的最后一趟为止,鉴于此,希尔排序也叫做 缩小增量排序。
二、希尔排序流程图示
算法伪代码就不复制粘贴了,一是因为网上的资源较多,二是不够直观。下图展示了在只有8个整数的数组上执行希尔排序的每一趟的过程。
左半部分使用希尔增量序列对数组排序,右图使用Hibbard增量序列对数组排序,其中,
希尔增量序列的形式为:
Hibbard增量序列形式为:
箭头旁边的数字表示每趟排序后执行的赋值次数,因此,Hibbard增量序列优于希尔增量序列。
三、思考与总结
通过查阅相关资料,总结一些个人的思考如下:
- 每一趟排序都是由在一个或几个没有交集的子数组上执行的插入排序构成(图中每一趟排序之前不同颜色的元素属于同一个子数组);
- 最后一趟排序是在整个数组上执行了一次插入排序,所以算法是正确的;
- 排序的性能主要依赖增量序列的选择;
- 如果数组基本有序,排序时间可能会减少;
- 对于像Sedgewick提出的增量序列,其性能甚至优于堆排序;
- 虽然插入排序是稳定的,但由多次插入排序过程组成的希尔排序是不稳定的;
- 随着增量的减小,各趟排序的给人的跳跃感逐渐减小,逆序对逐渐减少,直观上减少了后面各趟排序的执行时间;
从实践中,希尔排序对于适度的大量输入数据是可以接受的,因为基于Sedgewick提出的增量序列的希尔排序最坏情形可以达到,因此对于数以万计的数据进行排序还是非常高效的。