果然能用名字来命名的知识都是大神级别的。最近学习了希尔排序,写一篇文章总结一下,相信你看了会有很大收获。
声明一点本处的增量选择采用的是希尔建议的方式,而更好的方式是采用互质的增量序列。选择这样的目的是不增加代码的复杂性,从而更好的理解希尔排序。一旦我们理解了基本原理,其余的都是很好解决的,一起来看看。
一.前言
我们都知道插入排序按查找位置的方式不同,又可以分为三类:采用顺序法查找插入位置——直接插入排序;采用折半(二分)查找法查找插入位置——折半(二分)插入排序;缩小增量多遍插入排序——希尔排序。
同时插入排序的效率是由比较次数和移动次数共同决定的。
直接插入排序:
如果原始数据越接近有序,直接插入排序效率较高(即逆序个数越少越快);在待排序的记录个数较少时,效率较高。直接插入排序是一种稳定的插入排序
折半插入排序:
该方法相对直接插入排序,降低 了比较的次数,但是没有降低移动的次数。平均性能来说比直接插入排序要好。该方法也是一种稳定的插入排序。
那么有没有一种方式即能降低比较次数又能降低移动次数,答案就是希尔排序。
希尔排序也称为缩小增量排序。增量指的是按照某一种约定对数据进行分组,比如将数据5个5个的分为一组。缩小增量也就指按某种约定将分组的范围缩小,直到增量为1。
二.思想及操作
基本思想:
先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
希尔排序图解:
有如上所示图,第一排为数组下标,第二排代表每个数组位置所对应存储的数据,现在要从小到大对该数据进行排序。我们按照希尔排序的发明者Donald Shell所建议的选择增量序列的方式:初始增量为数据个数的一半,之后的每一次都变为二分之一,直到增量变为1。
第一次按增量为6(13/2=6)进行分组