排序算法中可以大致分为以下几类
- 插入类排序:直接插入排序、折半插入排序、希尔排序
- 选择类排序:简单选择排序、堆排序
- 交换类排序:冒泡排序、快速排序
本文介绍shell排序的基本实现思路,shell排序
也叫“缩减增量排序”(disminishing increment sort),基于插入排序进行,这就说明了增量在希尔排序中的重要性。它是简单插入排序经过改进之后的一个更高效的版本,同时该算法是冲破O(n2)的第一批算法之一。它与插入排序的不同之处在于,它会优先比较距离较远的元素。
希尔排序的时间复杂度
希尔排序的时间复杂度和增量h的选取有关,例如当增量h=1时,相当于进行了一次插入排序,时间复杂度为O(N²);而Hibbard增量的希尔排序时间复杂度为O(N3/2),所以无法准确说出希尔排序的时间复杂度,而希尔排序的空间复杂度为O(1)。可见增量的选择对希尔排序的
增量的选择问题
为这个问题顶尖高手们讨论了几十年也\没得出个结果来. 去看看Knuth的,里边写了一大堆. <C: The Complete Reference>的作者Herbert Schildt的观点是:
- 永远不要使用2的幂次量作为增量
- 最后一个增量一定要是1(废话!)
- 他老人家推荐: 9, 5, 3, 1
扩展:插入排序点击查看
1.从数组的第二个数据开始往前比较,即一开始用第二个数和他前面的一个比较,如果 符合条件(比前面的大或者小,自定义),则让他们交换位置。
2.然后再用第三个数和第二个比较,符合则交换,但是此处还得继续往前比较,比如有 5个数8,15,20,45, 17
,17比45小,需要交换,但是17也比20小,也要交换,当不需 要和15交换以后,说明也不需要和15前面的数据比较了,肯定不需要交换,因为前 面的数据都是有序的。
3.重复步骤2,一直到数据全都排完。