作者 |  小鹿同学

来源 |  小鹿动画学编程

写在前边

排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的插入排序。还有一些其他经典的排序,小鹿整理的共有十种是面试常问到的,冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序、桶排序、计数排序、基数排序。

虽然我们基本知道了这些排序算法,但是在实际项目开发以及面试中往往出乎我们所料。在面试中,经常会被问到各种排序之间的比较;在实际项目中,往往排序的数据不是我们所练习的整数。

那么今天我们来学习一下,插入排序比我们之前讲的冒泡排序有什么区别呢?面试官问我们,我们如何回答完整呢?

思维导图

1

如何分析一个排序算法?

之前写的一篇很详细的文章。

佩奇学编程 | 复杂度分析原来这么简单

分析排序算法已经成为我们衡量一个算法优良的重要标准,从以下三个方面入手。

1.1 时间效率

这里所谓的实践效率就是时间复杂度,相信大家对于时间复杂度并不陌生。

复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。

对于时间复杂度的分析,要把最好时间复杂度、最坏时间复杂度、平均时间复杂度分析出来,分别对应了排序算法的最好排序情况、最坏排序情况以及平均排序效率。

1.2 空间消耗

所谓的空间消耗对应的是空间复杂度,在排序算法中需要开辟的额外内存空间是多少。如果空间复杂度为 O(1),此时该排序叫做原地排序。

注意:是额外的内存空间,存储排序数据消耗的空间不计。

1.3 稳定性

算法的稳定性虽然我们之前接触的很少,但是稳定性也是衡量一个排序算法的重要标准。什么是稳定排序呢?比如有一组有重复待排序的数据,排序前后,重复的数据顺序不变,此时该排序为稳定排序。否则,叫做不稳定排序。它在实际应用中非常重要的,今天我们就不多说,以后会慢慢分享到。

2

什么是插入排序?

顾名思义,插入排序就是通过插入的方式来排序呗,最经典的就是打斗地主,可以将打乱的扑克牌作为未排序区间,手中已经排好序的作为排序区间。每次我们摸牌的过程,就是从未排序区间,通过插入的方式,插入到已排序区间。那么这个过程就称为插入排序。

3

如何实现插入排序?

上述插入排序的概念我们已经理解了,那么给你一组数据,如何来进行插入排序呢?

首先我们要将数据划分为两个区间,已排序区间和未排序区间。

我们从未排序区间取出数据和已排序区间的数据进行比较,如果小于已排序区间的数据,那我们就交换数据。

如果交换到已排序区间数据不在大于插入的数据,然后将元素插入进去。

最后我们看一下总的插入排序动画和代码实现。

4

插入排序的性能

我们通过上边的对插入排序的拆分讲解和动画以及代码实现,想必面试官让你手写一个插入排序可以轻轻松松写出。但是我们掌握的插入排序知识还往往不够,我们在实际项目中,还要考虑插入排序的性能怎么样?因为才能更好的选择适当排序应用到项目中去。

4.1 插入排序的稳定性

再插入排序中,如果存在重复数据的话,前边的元素再插入的过程永远在第二个重复数据的前边,所以插入排序后的重复数据前后顺序不变,所以插入排序是稳定排序算法。

4.2 插入排序的空间消耗

我们可以发现,插入排序的移动方式,需要消耗常量级的额外内存空间存储,也就是代码中的 temp,所以时间复杂度为 O(1),我们上边讲到,空间复杂度为O(1)的是原地排序算法。

4.3 插入排序的时间效率

插入排序的最好情况就是不需要搬移任何数据,从头到尾寻找插入数据,每次只比较一次即可,即一组有序数据,所以最好时间复杂度为O(n)。

如果一组数据正好是倒序输出,那么每次都需要比较移动所有数据,每次移动时 n,n 个数据时间复杂度为O(n²)。

对于插入排序的平均时间复杂度,每次插入都要移动数据,插入 n 次,所以平均时间复杂度为 O(n²)。

5

小结

我们学完了今天的插入排序之后,我们回到最初的面试官问题上。插入排序和冒泡排序哪个更好呢?

我们现在元素移动次数上进行分析,如果一组无序的数据通过冒泡排序排好序之后,它的交换次数是这种数据的逆序度;对于插入排序来说也是一样的,移动次数上都是原本数据的逆序度。

元素的移动次数是相同的,那我们接下来看看元素的交换次数。从代码上分析可以明显看出,冒泡排序的一次交换需要三行代码,而插入排序的交换却需要一行,所以总的交换次数冒泡排序大于插入排序。

有小伙伴会问,这两行的差别有那么大吗?移动一次,我们可以不计较,如果数据很多,想想下,两者的效率差别很轻易的就比较出来了。

虽然冒泡排序的时间复杂度和插入排序的时间复杂度是相同的,但是我们实际使用中还是优先选择插入排序。

对于插入排序还是可以优化的,对了,没错,就是希尔排序,我们在这不多分开写,后期会继续更新。

如果觉得写的有帮助,欢迎转发朋友圈圈哦!

有热门推荐????

1.【程序员】我们就必须承认:这个世界上,有很多问题,就是无解的

2.【GitHub】我在 GitHub 上看到了一个丧心病狂的开源项目!

3.【算法】动画:七分钟理解什么是KMP算法

4.【数据结构】十大经典排序算法动画与解析,看我就够了!

动画:面试官问我插入排序和冒泡排序哪个更牛逼?相关推荐

  1. 存在就不插入_动画:面试官问我插入排序和冒泡排序哪个更牛逼?

    来自公众号:小鹿动画学编程 写在前边 排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的插入排序.还有一些其他经典的排序,小鹿整理的共有 ...

  2. 冒泡排序java代码_面试官问我插入排序和冒泡排序哪个更牛逼?

    (给算法爱好者加星标,修炼编程内功) 来源:小鹿动画学编程,作者:小鹿同学 写在前边 排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的 ...

  3. 当面试官问我ArrayList和LinkedList哪个更占空间时,我这么答让他眼前一亮

    前言 今天介绍一下Java的两个集合类,ArrayList和LinkedList,这两个集合的知识点几乎可以说面试必问的. 对于这两个集合类,相信大家都不陌生,ArrayList可以说是日常开发中用的 ...

  4. 动画:面试官问我 0.1 + 0.2 __ 0.3 ? 为什么?该如何正确回答?

    作者 | 小鹿 来源 | 小鹿动画学编程 写在前边 第一次去面试,面试官问我0.1 + 0,2 __ 0.3?估计很多人都知道在 JS 中0.1 + 0.2 != 0.3 的,至于大于还是小于还真没弄 ...

  5. 已经成功拿到了几个offer的我来告诉你,Android面试官问的一些问题,看完这一篇就没有拿不到的offer

    前言 我是2020年毕业于中南大学的计算机学院的,大家可以叫我小吴,我嘞毕业之后在华为实习了差不多一年多,一直都从事着Android开发. 然后2021年的时候因为我自己的一些原因打算离职到外面看看, ...

  6. 面试官问你想找什么工作_找工作时如何面试面试官

    面试官问你想找什么工作 在技​​术面试中要问的十二个问题 (Twelve questions to ask at tech interviews) I've just come off six wee ...

  7. 面试官问:select......for update会锁表还是锁行?

    欢迎关注方志朋的博客,回复"666"获面试宝典 select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁 ...

  8. 面试官问:数据库 delete 表数据,磁盘空间还是被一直占用,为什么?

    以下文章来源方志朋的博客,回复"666"获面试宝典 最近有个上位机获取下位机上报数据的项目,由于上报频率比较频繁且数据量大,导致数据增长过快,磁盘占用多. 为了节约成本,定期进行数 ...

  9. 面试官问:Kafka 会不会丢消息?怎么处理的?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! Kafka存在丢消息的问题,消息丢失会发生在Broker, ...

最新文章

  1. python编写ftp客户端_用Python写FTP客户端程序
  2. MySQL(二)InnoDB的内存结构和特性
  3. 在线nltk分词和词性标注
  4. 01 菜单栏和工具栏(一)
  5. bzoj 1603: [Usaco2008 Oct]打谷机(拆点并查集)
  6. 一路风雨走过来:那些我亲密接触过的项目
  7. 硕士研究生培养方案及课程大纲
  8. 利用DirectoryEntry获取域内计算机以及共享资源
  9. 点云3D目标检测学习(2):pointnet++源码
  10. 计算机的组装与维修的知识点总结,计算机组装与维修教学总结
  11. 大规模异构图召回在美团到店推荐广告的应用
  12. 112358序列c语言,112358(112358的规律是什么)
  13. 解决浏览器访问GitHub响应时间长,速度慢的问题
  14. 基于51单片机+ULN2003控制步进电机S曲线加减速
  15. Go语言核心:Go的基本结构
  16. 中国首枚NFC邮票发行背后,NFC技术的“有限性”创新
  17. 【Android】更改程序图标
  18. 2021年氯化工艺考试总结及氯化工艺复审考试
  19. 探究c++智能指针中auto_ptr_ref的存在意义
  20. 抽屉实现评论数据结构及评论内容显示示例

热门文章

  1. Windows文件管理软件分享
  2. 第三方MiPush框架上线:既保证推送,又无需应用挂后台
  3. 实践活动——参观科技馆
  4. 【项目】小帽教育(一)
  5. 娱乐圈阴阳合同偷漏税事件
  6. 最详细的“ECC-汉明码”原理讲解
  7. 【Verilog刷题篇】硬件工程师从0到入门2|组合逻辑
  8. java中准考证的如何生成_java考证或考试1-2实践试卷
  9. 比较著名的.net技术论坛名称(含国外的)
  10. 自己动手——U盘病毒查杀+防毒套装(豪华版)