排序算法之希尔排序
Posted ccxka
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序算法之希尔排序相关的知识,希望对你有一定的参考价值。
来源
希尔排序是插入排序的改进版,插入排序是要和每一个元素进行比较,如果本身就有序,这个比较就显得多余,那么我们可以设定一个间隔来解决,这个就叫做希尔排序。希尔排序是早一批突破O(n^2)的排序算法
过程
图来自https://www.cnblogs.com/chengxiao/p/6104371.html,感谢作者写这么详细
上面的图就是希尔排序的基本逻辑,那么这个间隔我们该怎么选择呢,上网查大家一般都分为两种
第一种:取得数组的长len,每一次都用len/2来缩短步长
第二种:h=3*h+1;用这个公式来计算步长(1,4,13,40...),什么时候结束?h>=en/3的时候结束
最开始我就是在这里绕了好久,后来才发现这个间隔的取法很多人不相同所以代码判断临界点就不一样
1 //希尔排序 2 public void shellSort(int[] nums){ 3 4 int len = nums.length; 5 int gap = 0; 6 //生成gap 7 while(gap < len/3){ 8 gap = gap * 3 + 1; 9 } 10 while(gap >= 1){ 11 for(int i=gap; i<len; i++){ 12 //找到与自己增量匹配元素的位置 13 int j = i - gap; 14 //将小一点的放前面 15 while(j>=0 && nums[j]>nums[i]){ 16 //交换 17 int temp = nums[j]; 18 nums[j] = nums[i]; 19 nums[i] = temp; 20 } 21 } 22 //逐步缩短步长 23 gap = (gap - 1) / 3; 24 } 25 }
性能分析
希尔排序并不是稳定的,一次插入排序是稳定的,但是在插入的过程中,有些元素的相对顺序会发生变化
时间复杂度:
最坏情况:O(n^2)
最好情况:关于希尔排序算法的时间复杂度是与步长的取定有关系的,目前在数学上还没有明确的论证。
在严蔚敏的书中述:经过大量实验,有的人认为增量序列公式为 = 时,希尔排序时间复杂度为 ,其中 t 为排序的趟数,1 k t 。
Wiki中描述:当步长取 step = 时,时间复杂度为 。
在其他数据结构书本中(如:《大话数据结构》),则描述时间复杂度为 。
在其他有关该算法描述的资料上,如:Web上等,有的也是直接描述为 。
空间复杂度:O(1)
以上是关于排序算法之希尔排序的主要内容,如果未能解决你的问题,请参考以下文章