9.6.1 变不可能为可能

给大家出一道智力题。请问“VII”是什么?
        嗯,很好,它是罗马数字的7。现在我们要给它加上一笔,让它变成8(VIII),应该是非常简单,只需要在右侧加一竖线即可。
        现在我请大家试着对罗马数字9,也就是“IX”增加一笔,把它变成6,应该怎么做?
        (几分钟后)
        我已经听不少声音说,“这怎么可能!” 可为什么一定要用常规方法呢?
        我这里有三种另类的方法可以实现它。
        方法一:观察发现“X”其实可以看作是一个正放一个倒置两个“V”。因此我们,给“IX”中间加一条水平线,上下颠倒,然后遮住下面部分,也就是说,我们所谓的加上一笔就是遮住一部分,于是就得到“VI”。

方法二:在“IX”前面加一个“S”,此时构成一个英文单词“SIX”,这就等于得到一个6了。哈哈,我听到下面一片哗然,我刚有没有说一定要是“VI”呀,我只说把它变成6而已,至于是罗马数字还是英文单词,我可没有限制。显然,你们的思维受到了我前面举例的“VII”转变为“VIII”的影响。

方法三:在“IX”后面加一个“6”,得到“1X6”,其结果当然是数字6了。大家笑了,因为这个想法实在是过分,把字母“I”当成了数字1,字母“X”看成了乘号。可谁又规定说这是不可以的呢?只要没违反规则,得到6即可。

智力题的答案介绍完了 。大家会发现,看似解决不了的问题,还真不一定就没有办法,也许只是暂时没想到罢了。
        我们都能理解,优秀排序算法的首要条件就是速度(还有其他要求,速度是第一位的)。于是人们想了许许多多的办法,目的就是为了提高排序的速度。而在很长的时间里,众人发现尽管各种排序算法花样繁多(比如前面我们提到的三种不同的排序算法),但时间复杂度都是O(n2),似乎没法超越了(这里排序指内排序)。此时,计算机学术界充斥着“排序算法不可能突破O(n2)”的声音。就像刚才大家做智力题的感觉一样,“不可能”成了主流。
        终于有一天,当一位科学家发布超越了O(n2)新排序算法后,紧接着就出现了好几种可以超越O(n2)的排序算法,并把内排序算法的时间复杂度提升到了O(nlog2n)。“不可能超越O(n2)”彻底成为了历史。
        从这里也告诉我们。做任何事,你解决不了时,想一想“Nothing is impossible!”,虽然有点唯心,但这样思维方式会让你更加深入的思考解决方案,而不是匆忙的放弃。

9.6.2 希尔排序原理
        现在,我要讲解的算法叫希尔排序(Shell Sort)。希尔排序是D.L.Shell于1959年提出来的一种排序算法,在这之前排序算法的时间复杂度基本都是O(n2)的,希尔排序算法是突破这个时间复杂度的第一批算法之一。
        我们前一节讲的直接插入排序,应该说,它的效率在某些时候是很高的,比如,我们的记录本身就是基本有序的,我们只需要少量的插入操作,就可以完成整个记录集的排序工作,此时直接插入很高效。还有就是记录数比较少时,直接插入的优势也比较明显。可问题在于,两个条件本身就过于苛刻,现实中记录少或者基本有序都属于特殊情况。
        不过别急,有条件当然是好,条件不存在,我们创造条件,也是可以去做的。于是科学家希尔研究出了一种排序,对直接插入排序改进后可以增加效率的方法。
        如何让待排序的记录个数较少呢?很容易想到的就是将原本有大量记录数的记录进行分组。分割成若干个子序列,此时每个子序列待排序的记录个数就比较少了。然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时,注意只是基本有序时,再对全体记录进行一次直接插入排序。
        此时一定有同学开始疑惑了。这不对呀,比如我们现在有序列是{9,1,5,8,3,7,4,6,2},现在将它分成三组,{9,1,5},{8,3,7},{4,6,2},哪怕将它们各自排序排好了,变成{1,5,9},{3,7,8},{2,4,6},再合并它们成{1,5,9,3,7,8,2,4,6},此时,这个序列还是杂乱无序,谈不上基本有序,要排序还是重来一遍直接插入有序,这样做有用吗?需要强调一下,所谓的基本有序,就是小的关键字基本在前面,大的基本在后面,不大不小的基本在中间,像{2,1,3,6,4,7,5,8,9}这样可以称为基本有序了。但像{1,5,9,3,7,8,2,4,6}这样的9在第三位,2在倒数第三位就谈不上基本有序。
        问题其实也就在这里,我们分割待排序记录的目的是减少待排序记录的个数,并使整个序列向基本有序发展。而如上面这样分完组后,就各自排序的方法达不到我们的要求。因此,我们需要采取跳跃分割的策略:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序

出处:http://www.cnblogs.com/cj723/archive/2011/04/19/2021613.html

《大话数据结构》第9章 排序 9.6 希尔排序(上)相关推荐

  1. 大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法

    大话数据结构 第七章 图(二) 最小生成树.最短路径.拓扑排序.关键路径算法 最小生成树 定义 Prim算法 Kruskal算法 最短路径 Dijkstra算法 Floyd算法 拓扑排序 AOV网 拓 ...

  2. 《大话数据结构》第9章 排序 9.6 希尔排序(下)

    9.6.3 希尔排序算法         好了,为了能够真正弄明白希尔排序的算法,我们还是老办法--模拟计算机在执行算法时的步骤还研究算法到底是如何进行排序的.         希尔排序算法代码如下. ...

  3. 《大话数据结构》样章试读

    <大话数据结构>样章试读 各位童鞋,<大话数据结构>从写作到出版,虽然经历了一些坎坷,但终于还是在今天正式在一些网店发售了.现在提供两章的完整版试读PDF文件,希望能给您有所 ...

  4. 数据结构排序法之希尔排序法(Shell Sort)

    希尔排序,也叫递减增量排序,是插入排序的一种更高效的改进版本.希尔排序是不稳定的排序算法. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 1.插入排序在对几乎已经排好序的数据操作时,效率高, ...

  5. 【数据结构笔记33】C实现:希尔排序、增量序列

    本次笔记内容: 9.2 希尔排序 文章目录 希尔排序 希尔排序方法 希尔排序实现 改进:更多增量序列 希尔排序 希尔排序方法 由Donald Shell提出,应用了插入排序的简单,但是又克服了插入排序 ...

  6. 我的Java开发学习之旅------gt;Java经典排序算法之希尔排序

    一.希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种插入排序算法,因D.L.Shell于1959年提出而得名. Shell排序又称作缩小增量排序. 二.希尔排序的基本思想 希尔 ...

  7. 我的Java开发学习之旅------Java经典排序算法之希尔排序

    一.希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种插入排序算法,因D.L.Shell于1959年提出而得名. Shell排序又称作缩小增量排序. 二.希尔排序的基本思想 希尔 ...

  8. 十大经典排序算法之希尔排序及其优化

    一.希尔排序 1.概念 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进. 希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名. 它通过比较相距 ...

  9. JAVA排序算法之希尔排序

    基本介绍 希尔排序是希尔(Donald Shell)于 1959 年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序. 希尔排序法基本思 ...

  10. [算法]-排序算法之希尔排序

    希尔排序算法思想 希尔排序的实质就是分组插入排序,该方法又称缩小增量排序. 基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序 ...

最新文章

  1. tomcat如何增大并发_系统的性能瓶颈,排查该从哪些方面入手,如何定位?
  2. 一句代“.NET技术”码实现批量数据绑定[上篇]
  3. 白宫力挺FBI:库克干扰司法与正义
  4. 基于图像切换器(imageSwitcher)的支持动画的图片浏览器
  5. 网络技术学习资料分享
  6. python_day12_html
  7. 使用guava带来的方便
  8. 快到年底了,小伙伴开始关心年终奖话题了
  9. python oop 继承_关于oop:使类数据在python中可继承的正确方法是什么?
  10. 计算机网络 IP:ABC类地址与 子网掩码(ABC类网络均有属于自己的私有IP段 节省32位IP资源 ) 网络地址 主机地址 子网 与子网掩码之间的关系换算 IP和子网掩码相互依存
  11. 微信小程序安卓和ios时间格式问题
  12. 软件测试工具Winrunner TSL命令简介
  13. 面试常见的八股文记录
  14. Kotlin 的静态代码分析工具
  15. 四旋翼无人机飞控系统设计(闭环控制系统)
  16. (完稿)跟大表哥学常识一,15张思维导图
  17. Docker:架构分解
  18. 群响黄宝书:淘宝客历史沿革和新崛起的淘宝高手分享
  19. OrangePi 5 Docker下安装OpenWRT作软路由(同样适用于树莓派等设备)
  20. ubuntu安装zsh及环境配置

热门文章

  1. 湖南2021年计算机一级考试,2021年湖南计算机一级考试时间(4页)-原创力文档...
  2. Linux kmap和kmap_atomic解析
  3. 算法与数据结构(快速排序)
  4. Apache ZooKeeper - ZK的内存数据 + 持久化事务日志 + 数据快照 初探
  5. browsersync php,用browserSync吞下4个php
  6. 对html5的了解,HTML5——对HTML5的认识
  7. react 和 lodash 完美结合命令
  8. php ajax 时间戳,获取时间戳 和 备用ajax案例
  9. python知识:NetworkX初步
  10. halcon算子盘点:Chapter 12:OCR(光字符识别)