希尔排序

一、基本思想

希尔排序(Shell Sort)的基本思想是使数组中任意间隔为h的元素都是有序的。
换句话说,一个h有序数组就是h个相互独立的有序数组编织在一起组成的数组。
希尔排序基于插入排序,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。


1-1 希尔排序示意图

具体步骤:

  1. 产生一个从大到小的递增序列:h=M,N,J,Q,…,1;
  2. 对于每个递增序列,对其所有元素进行插入排序;
  3. 当h=1排序完成后,整个数组即有序。


    1-2 希尔排序用例图

二、算法实现

public static void sort(Comparable[] a) {
    int n = a.length;
 
    // 产生一个递增序列:  1, 4, 13, 40, 121, 364, 1093, ... 
    int h = 1;
    while (h < n/3) h = 3*h + 1; 
   
   
    while (h >= 1) {
        // h-sort the array
        for (int i = h; i < n; i++) {
            for (int j = i; j >= h && less(a[j], a[j-h]); j -= h) {
                exch(a, j, j-h);
            }
        }
        h /= 3;
    }
    assert isSorted(a);
}

三、性能分析

  • 特点
    希尔排序是插入排序的变形应用,最优时间复杂度目前仍无法证明;
    对于一般大小的数组,可以采用希尔排序解决;
    希尔排序的困难之处在于递增序列h的选择,目前尚未有证明某个序列是最好的。
  • 时间复杂度
    最坏情况:O( N^(3/2) ),无法确认其平均时间复杂度
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 算法简介 希尔排序的由来:1959 年 Shell 发明;第一个突破 O(n^2) 的排序算法;是简单插入排序的改...
    TinyDolphin阅读 8,841评论 1 3
  • 文 | 莫若吻 (注:如果想更好的理解希尔排序,请先看看我的上一篇博客插入排序,希望会对你有帮助。) 一、简介 希...
    Promise_Sun阅读 66,148评论 18 62
  • 一、简介 希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。 希尔排序是基于插入排序的以下两点性质...
    野狗子嗷嗷嗷阅读 4,468评论 0 0
  • 每个人都曾经以为,自己无忧无虑的14岁会很长很长,长到永远也过不完,自己不会长大,现在相信的,将来也要相信。现在不...
    少女芙阅读 11,676评论 0 2
  • 五月份荆门产业园建设主要围绕三个方面展开工作: 一是组织、督促、配合园区消防工程承包单位完成消防竣工验...
    邹崇勃阅读 3,493评论 0 0

友情链接更多精彩内容