希尔排序(ShellSort)是以它的发明者Donald Shell名字命名的,希尔排序是插入排序的改进版,实现简单,对于中等规模数据的性能表现还不错

一、排序思想

前情回顾:漫画:什么是插入排序算法?(对插入排序不熟悉的强烈建议先阅读此文)

一天,一尘拿着扑克自己在那玩,刚被师傅看见了

数据有序程度越高,越高效(移动少)

首先它把较大的数据集合分割成若干个小组(逻辑上分组),然后对每一个小组分别进行插入排序,此时,插入排序所作用的数据量比较小(每一个小组),插入的效率比较高

**注意:**下面有颜色的是逻辑上的分组,并没有实际地进行分组操作,在数组中的位置还是原来的样子,只是将他们看成这么几个分组(逻辑上分组)

可以看出,他是按下标相隔距离为4分的组,也就是说把下标相差4的分到一组,比如这个例子中a[0]与a[4]是一组、a[1]与a[5]是一组…,这里的差值(距离)被称为增量

每个分组进行插入排序后,各个分组就变成了有序的了(整体不一定有序)

此时,整个数组变的部分有序了(有序程度可能不是很高)

然后缩小增量为上个增量的一半:2,继续划分分组,此时,每个分组元素个数多了,但是,数组变的部分有序了,插入排序效率同样比较高

同理对每个分组进行排序(插入排序),使其每个分组各自有序

最后设置增量为上一个增量的一半:1,则整个数组被分为一组,此时,整个数组已经接近有序了,插入排序效率高

同理,对这仅有的一组数据进行排序,排序完成

二、排序代码

对于已经熟悉插入排序的一尘来说这并不是什么难事,很快,一尘写出了希尔排序的代码

随后一尘写出了插入arr[i]到所在组正确位置的代码(insertI

insertI 和直接插入排序里的插入代码几乎完全一样

三、时间复杂度

接下来又是分析时间复杂度吧,一尘心里想

希尔排序的复杂度和增量序列是相关的

{1,2,4,8,…}这种序列并不是很好的增量序列,使用这个增量序列的时间复杂度(最坏情形)是O(n^2)

Hibbard提出了另一个增量序列{1,3,7,…,2k-1},这种序列的时间复杂度(最坏情形)为O(n1.5)

Sedgewick提出了几种增量序列,其最坏情形运行时间为O(n^1.3),其中最好的一个序列是{1,5,19,41,109,…}

对不同增量的复杂度感性趣可以参考《数据结构与算法分析》一书或其他相关论文

四、稳定性

关于稳定性可看:冒泡排序

说完,一尘继续玩起了扑克

另外,算法的学习也是必经之路,这里给大家推荐一个大佬的刷题笔记

下载链接:BAT大佬的刷题笔记太经典

把这份笔记突击学习一下,很多算法考察,基本都稳了

另外,再给大家推荐一份某大佬的 leetcode 刷题笔记,汇聚了上千道 leetcode 题解,并且代码都是 beat 100%:

下载链接:leetcode 分类题解(最优解)

就算你现在不学算法,那么这份笔记也值得你收藏,万一有人问你 Leetcode 某道题解,或者有大神在讨论题解,咱打开这份笔记,不管三七二十一,直接把最优解扔给他,然后退出群聊

作者简洁

作者:大家好,我是帅地,从大学、自学一路走来,深知算法计算机基础知识的重要性,公众号「帅地玩编程」10万粉丝作者,专业于写这些底层知识,提升我们的内功,帅地期待你的关注,和我一起学习,点击了解我四年大学学 习之路 转载说明:未获得授权,禁止转载

漫话:希尔排序,这篇还看不懂麻烦找我拿红包相关推荐

  1. 关于排序算法,看这一篇就够了!这篇看不懂麻烦找我拿红包

    排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序. 内部排序是数据记录在内存中进行排序. 而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排 ...

  2. 决策树 随机森林 xgboost_从决策树到随机森林理论篇从人话到鬼话:看不懂来找我麻烦...

    从决策树产生的一些列的问题,过度到随机森林: 全文大概要阅读10分钟: 随机森林算法范畴 监督学习分类算法,基模型是由决策树组成 决策树 决策树模型与学习 特征选择 决策树生成 决策树剪枝 CART算 ...

  3. 身为程序员还看不懂UML类图? 一文带你零基础学会看UML类图!

    身为程序员还看不懂UML类图? 一文带你零基础学会看UML类图! 一,UML类图示例图 二,UML类图图例 三,分步解析说明 3.1 类图: 3.2 接口: 3.3 实现继承 3.4 实现接口: 3. ...

  4. 还看不懂同事的代码?Lambda 表达式、函数接口了解一下

    本文经授权转载自微信公众号:未读代码 Java 8 早已经在2014 年 3月 18日发布,毫无疑问 Java 8 对 Java 来说绝对算得上是一次重大版本更新,它包含了十多项语言.库.工具.JVM ...

  5. 这篇 ReentrantLock 看不懂,加我我给你发红包

    来自:Java建设者 回答一个问题 在开始本篇文章的内容讲述前,先来回答我一个问题,为什么 JDK 提供一个 synchronized 关键字之后还要提供一个 Lock 锁,这不是多此一举吗?难道 J ...

  6. 老罗的《Android系统源代码情景分析》翻了10遍还看不懂?因为你用错了

    最近老朽又把罗升阳老师的<Android系统源代码情景分析>拿出来啃了一番. 为什么要加个"又"呢?因为从老罗的第一版开始到迄今为止尚未更新的第三版为止,每年有学习冲动 ...

  7. 算法系列【希尔排序】篇

    常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 关于时间复杂度: 1.     平方阶 (O(n2)) 排序各类简单排序:直接插入 ...

  8. 操作系统 - 看完这篇还读不懂《银行家算法》那我也没办法了

    故事背景 为什么想到总结一篇从 0-1 学习银行家算法,读这篇至少要有死锁的概念,网上很多文章根本没讲解当中的一些小概念,连概念和算法过程都不了解,直接上题目怎么看得懂? 原理讲解 非剥夺资源的竞争和 ...

  9. 机器学习作业之波士顿房价(boston)数据分析与绘图(注释我都写了这么多,我不信你还看不懂?)

    目录 一.前言 二.简单介绍头文件 1.sklearn头文件 意外 2.其他头文件 三.题目理解 1.题目的简单介绍 2.属性标签 3.降维比喻 四.代码 1.代码及注释 2.代码缺点 五.运行结果 ...

  10. 熬夜整理Java面试笔试题,你还看不懂吗?

    前言 说真的,在 Java 使用最多的集合类中,List 绝对占有一席之地的,它和 Map 一样适用于很多场景,非常方便我们的日常开发,毕竟存储一个列表的需求随处可见.尽管如此,还是有很多同学没有弄明 ...

最新文章

  1. java去重复的集合_如何去除Java中List集合中的重复数据
  2. 数据防泄漏(中文版)
  3. java poi 导出 国际化_更好用的excel国际化多语言导出
  4. python画双折线图-Python Pandas 时间序列双轴折线图
  5. CV】keras_resnet 在cifar10数据集上分类
  6. Python从数据库读取大量数据批量写入文件的方法
  7. XP 安装Oralce 10g 数据库
  8. 数博会重磅活动:第二届大数据科学与工程国际会议议程
  9. bootstrap 2021-04-20
  10. 【笑话】男生追女生的数学模型
  11. Ubuntu 配置 SFTP 服务器
  12. c语言常量ascii码表,C语言常用转义符和ASCII码表
  13. 【无标题】快宝电子面单接口
  14. c语言计算音频分贝函数,获取PCM音频数据的声音分贝值
  15. [三剑客]老男孩教育-三剑客笔试题集合
  16. mezzanine-一个功能强大且易于扩展性的Django框架构建的内容管理平台
  17. 深入理解激活函数之softmax
  18. SwiftUI AVKit 之合并和叠加音频mp3 并输出
  19. 拓嘉辰丰电商:拼多多所属哪种电商模式
  20. python画图turtle花开_Python绘图之(5)turtle 画一朵花

热门文章

  1. mysql 小于号转义_mybatis sql语句配置大于号小于号的处理
  2. songshu-video-uniapp-YYC松鼠短视频前端源码-开源--优雅草科技官方发布
  3. 零基础的小白怎么学习数据分析?
  4. Optimization Week 5: Duality example
  5. homepod换wifi网络_HomeKit的最佳入口——HomePod使用体验
  6. 锂电池升压-SX1308
  7. 【web前端期末大作业】简单的学生网页作业源码 基于html css javascript jquery技术设计的音乐网站(44页)
  8. Torch中的benchmarkdeterministic是什么含义?
  9. linux 域名判断 跳转,Nginx判断不同的域名指向不同的root路径实例
  10. Day03 开始学Response