码迷,mamicode.com
首页 > 编程语言 > 详细

排序算法之希尔排序

时间:2018-08-26 16:49:33      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:描述   ram   数据结构   大量   性能分析   分析   分享图片   logs   作者   

来源

  希尔排序是插入排序的改进版,插入排序是要和每一个元素进行比较,如果本身就有序,这个比较就显得多余,那么我们可以设定一个间隔来解决,这个就叫做希尔排序。希尔排序是早一批突破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)

排序算法之希尔排序

标签:描述   ram   数据结构   大量   性能分析   分析   分享图片   logs   作者   

原文地址:https://www.cnblogs.com/ccxka/p/9537575.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!