希尔排序

简介:

希尔排序,英文Shell's sort,是一位叫D.L.Shell的老哥在1959就提出来的算法,是《插入排序》的一种又称“缩小增量排序”(Diminishing Increment Sort),其实就是是直接插入排序算法的一种高效的改进版本。

希尔排序是非稳定排序算法。

原理:

大的原理跟《插入排序》原理一样,都是后一位跟前一位比较大小,后一位小的就交换位置。

优化在于,这里增加了一个叫“量”的东西,其实就是分组的大小,然后每次开始,先把所有数组分成 “增量m” 个分组,当然每个分组的大小是增量n/m。然后每次增量m除以2,到最后为1(整个数组)结束。

思路:

  1. 这里假设开始设置一个增量n/2,

  2. 将所有数据分组,每组就是2个数(n为偶数的话),分组个数就是n/2个,n是数组长度。

  3. 然后这个几个分组在组内进行插入排序。

  4. 增量m=m/2,也就是分组数量减半,合并了,继续在变大了的分组进行插入排序。

  5. 重复步骤②③④,知道最后m=1,也就是只有一个分组,所有元素在一组,进行一次插入排序。

  6. 结束。

上图上图↓

示例数组[1,10,35,61,89,36,55,44]

第一轮,初始增量8除以2,为4

第一轮后数组[1,10,35,44,89,36,55,61]

第二轮增量4除以2,为2

第二轮后数组[1,10,35,36,55,44,89,61]

第三轮增量2除以2,为1

最后数组[1,10,35,36,44,55,61,89]。

表格形式展示↓

代码:

public static void sort3(int[] a) {    //增量    int gap = a.length;    do {        gap /= 2;   //增量每次减半        for (int i = 0; i < gap; i++) {            // 插入排序            for (int j = i; j < a.length; j += gap) {                int k;                int t = a[j];                for (k = j; k - gap >= 0 && t < a[k - gap]; k -= gap) {                    a[k] = a[k - gap];                }                a[k] = t;            }        }    } while (gap != 1);}

算法分析:

稳定性:

由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序。但是上面排序也可以看出,分组分轮进行排序的时候,不同的轮中相同的数,就可以发生次序变化,前后互换,最后其稳定性就会被打乱,所以shell排序是不稳定的。

时间复杂度:

希尔排序是基于插入排序的一种算法, 在此算法基础之上增加了一个新的特性,提高了效率。希尔排序的时间的时间复杂度为O(n^(3/2)),希尔排序时间复杂度的下界是n*log2n希尔排序没有快速排序算法快 O(n(logn)),因此中等大小规模表现良好,对规模非常大的数据排序不是最优选择。但是比O(n²)复杂度的算法快得多。并且希尔排序非常容易实现,算法代码短而简单。

此外,希尔算法在最坏的情况下和平均情况下执行效率相差不是很多,与此同时快速排序在最坏的情况下执行的效率会非常差。专家们提倡,几乎任何排序工作在开始时都可以用希尔排序,若在实际使用中证明它不够快,再改成快速排序这样更高级的排序算法. 本质上讲,希尔排序算法是直接插入排序算法的一种改进,减少了其复制的次数,速度要快很多。原因是,当n值很大时数据项每一趟排序需要移动的个数很少,但数据项的距离很长。当n值减小时每一趟需要移动的数据增多,此时已经接近于它们排序后的最终位置。正是这两种情况的结合才使希尔排序效率比插入排序高很多。

Shell算法的性能与所选取的分组长度序列有很大关系。

空间复杂度:

O(1),跟插入排序一样,是一个原地排序算法。

总结:

希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。


我预两副棺材,一副你的一副我的

shell按照时间排序_【经典排序】希尔排序相关推荐

  1. python经典排序_经典排序 python实现

    稳定的排序算法:冒泡排序.插入排序.归并排序和基数排序.不是稳定的排序算法:选择排序.快速排序.希尔排序.堆排序. 冒泡 defbobble(arr): length=len(arr)for i in ...

  2. 【Java数据结构与算法】第七章 冒泡排序、选择排序、插入排序和希尔排序

    第七章 冒泡排序.选择排序.插入排序和希尔排序 文章目录 第七章 冒泡排序.选择排序.插入排序和希尔排序 一.冒泡排序 1.基本介绍 2.代码实现 二.选择排序 1.基本介绍 2.代码实现 三.插入排 ...

  3. 排序算法(冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序)

    排序也叫排序算法,排序是将一组数据,依指定的顺序进行排列的过程. 排序的分类: 1)内部排序:指将需要处理的所有数据都加载到内部存储器中进行排序. 2)外部排序:数据量过大,无法全部加载到内存中,需要 ...

  4. 排序算法分析:冒泡排序、选择排序、插入排序、希尔排序、快速排序

    文章目录 一.冒泡排序 二.选择排序 三.插入排序 四.希尔排序 五.快速排序 一.冒泡排序 冒泡排序(Bubble Sort),它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大 ...

  5. 排序---初级排序算法(选择排序、插入排序和希尔排序)

    写在前面的话: 一枚自学Java和算法的工科妹子. 算法学习书目:算法(第四版) Robert Sedgewick 算法视频教程:Coursera  Algorithms Part1&2 本文 ...

  6. 十大排序算法:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    冒泡排序.选择排序.插入排序.希尔排序.归并排序.快速排序.堆排序.计数排序.桶排序.基数排序的动图与源代码. 目录 关于时间复杂度 冒泡排序 选择排序 插入排序 希尔排序 归并排序 快速排序 堆排序 ...

  7. 对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。

    题目要求: (1)对以下6种常用的内部排序算法进行比较:起泡排序.直接插入排序.简单选择排序.快速排序.希尔排序.堆排序. (2)待排序表的表长不小于100:其中的数据要用伪随机数产生程序产生:至少要 ...

  8. 程序员内功修炼之学好算法和数据结构(一)排序基础、选择排序、插入排序、希尔排序...

    一.排序基础(重要) 1.1 为什么要学习O(n^2)的排序算法? 编码简单,易于实现,是一些简单情景的首选. 在一些特殊情况下,简单的排序算法更有效. 简单的排序算法思想衍生出复杂的排序算法,在这个 ...

  9. js排序算法详解-希尔排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-希尔排序 希尔排序,直接上图: 像这个算法看图理解起来并不是很难,就像比赛一样,1-6一组,2-7一组,每差5 ...

  10. JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序)

    JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序) 一. 大O表示法 在进行排序算法之前,我们得先掌握一种对算法效率的表示方法,大O表示法. 我们使用大O表示法来表示算法的时间复杂 ...

最新文章

  1. 一只蝙蝠的自述,在朋友圈火了
  2. JavaScript系列-(原型-原型连-call-apply-继承)
  3. 数据中心可以不设置柴发吗?
  4. Linux搭建虚拟机,桥接模式下,主机能够Ping通虚拟机,虚拟机ping不通主机
  5. sqlmap自动扫描注入点_同天上降魔主,真是人间太岁神——SQLMAP 高级教程
  6. libevent -简单的异步IO介绍
  7. C++知识 interview
  8. Django(part13)--过滤器
  9. JavaFX UI控件教程(十)之Scroll Bar
  10. getDate()返回日期不一致问题引发的bug
  11. 【报告分享】字节跳动2019年企业社会责任报告.pdf(附下载链接)
  12. Google I/O 2019 行纪 —— Google 要让 AI 消除偏见
  13. 微软收购AI创业公司Bonsai,机械臂效率比DeepMind高45倍
  14. spring 默认情况下事务是惟一的 同一个方法里面第一个sql开启后 在执行完 将事务传递给下一个sql...
  15. 【数学建模】传染病SIR模型
  16. 宗成庆《文本数据挖掘》学习笔记:第二章 数据预处理和标注
  17. 反射的学习(参考尚硅谷视频)
  18. 最新的 CocoaPods 的使用教程 上传podspec
  19. 4PS-4CS--4RS
  20. 【表面缺陷检测】基于yolov5的布匹表面缺陷检测(附代码和数据集)

热门文章

  1. 初学者python笔记(类的装饰器、property方法、元类)
  2. python 驱动级鼠标_罗技各系鼠标测评(2020年12月更新)
  3. Python制作词云图根据蒙板图像确定形状和文字颜色
  4. Python+matplotlib绘制三维图形5个精选案例
  5. Python+django网页设计入门(6):文件上传与数据导入
  6. Python使用pandas合并多个Excel文件
  7. Python3.6下安装扩展库pywin32的正确姿势
  8. 针对递归函数的优化与Python修饰器实现
  9. C++ 泛型模板进阶
  10. java实现订单物品计算佣金,java三角形、NextDay、佣金问题代码