(给算法爱好者加星标,修炼编程内功)

来源:小鹿动画学编程,作者:小鹿同学

写在前边

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

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

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

思维导图

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

小结

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

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

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

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

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

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

推荐阅读

(点击标题可跳转阅读)

趣图:这个小萌妹用了什么排序算法?

常用排序算法之 JavaScript 实现

一遍记住 8 种排序算法与 Java 代码实现

觉得本文有帮助?请分享给更多人

关注「算法爱好者」加星标,修炼编程内功

好文章,我在看❤️

冒泡排序java代码_面试官问我插入排序和冒泡排序哪个更牛逼?相关推荐

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

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

  2. 动画:面试官问我插入排序和冒泡排序哪个更牛逼?

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

  3. java 暂停_面试官问我:平常如何对你的Java程序进行调优?

    java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢.接口超时,服务器负载高.并发数低,数据库频繁死锁等.尤其是在"糙快猛"的互联网开发模式大行其道的今天,随着系 ...

  4. 冒泡排序java代码_看动画学算法之:排序冒泡排序

    点击上方的蓝字关注我吧 程序那些事 简介 排序可能是所有的算法中最最基础和最最常用的了.排序是一个非常经典的问题,它以一定的顺序对一个数组(或一个列表)中的项进行重新排序. 排序算法有很多种,每个都有 ...

  5. java执行sql文件_面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他

    初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...

  6. .jar中没有主清单属性_面试官问:为什么SpringBoot的 jar 可以直接运行?

    点击上方蓝色字体,选择"设为星标" 优质文章,及时送达 来源 | https://urlify.cn/uQvIna SpringBoot提供了一个插件spring-boot-mav ...

  7. hashmap扩容_面试官问:HashMap在并发情况下为什么造成死循环?一脸懵

    这个问题是在面试时常问的几个问题,一般在问这个问题之前会问Hashmap和HashTable的区别?面试者一般会回答:hashtable是线程安全的,hashmap是线程不安全的. 那么面试官就会紧接 ...

  8. sql参数化还是被注入了_面试官问你 SQL 注入攻击了吗?

    目录 为什么要聊 SQL 注入攻击? 什么是 SQL 注入攻击? 如何进行 SQL 注入攻击? 如何防范? 常见面试题 瞎比比 为什么要聊 SQL 注入攻击? 我这人有个想法,就是不管自己跳不跳槽,每 ...

  9. 16 bit float 存储_面试官问我存储金额应该用哪种数据类型,我竟这样回答

    前言 ​ 最近在面试时,碰到这样一个问题:在问到项目部分时,面试官问我:你的项目中用到的分数.金额之类的数字是用的什么数据类型? 我没有过多思考脱口而出:double!随后面试官又问:为啥不用floa ...

最新文章

  1. 如何在DataGrid里面产生滚动条而不滚动题头
  2. 头文件的包含以及命名空间的引入尽量写在cpp里
  3. 用NiceTool在微信浏览器中下载APP
  4. 用 TWebBrowser 查找网页上的按钮,编辑框,
  5. 使用if和goto语句构造循环
  6. 信息系统项目管理师考试答题卡样式【下载PDF】
  7. boost::filesystem::copy用法的测试程序
  8. python安卓附带文件_Android QPython3 可视化-文件(夹)选择:ListFile.py
  9. 吉他谱——有多少爱可以重来
  10. js更新数组对象_7 种Vue 数据已更新而页面没有更新的情况及深化总结(收藏)
  11. java使用linux常用命令_linux常用Java程序员使用命令(一)
  12. Microsoft Blazor——快速开发与SQL Forms开源平台Platz.SqlForms
  13. where,having与 group by连用的区别
  14. 一份清单:所有可以放进head标签的元素
  15. 自学Shiro框架笔记
  16. SCT2612STER,4.2V-60V Vin,1A,高效、频率可调、降压DCDC转换器,LMR16010PDDAR 参数
  17. 如何进行EMC Symmetrix (DMX或者VMAX)的系统健康检查
  18. 车路协同先导试验平台
  19. GEE——2018 年南非国家土地覆盖( 20 米分辨率多季节 Sentinel 2 卫星图像生成的)
  20. numpy 轴与维度的理解

热门文章

  1. funuiTitle-居中问题修改
  2. PHP 解决session 死锁
  3. 七日瘦身汤绝妙配方 - 生活至上,美容至尚!
  4. MyBatis学习笔记(一):MAVEN的下载,安装与环境配置和在IDEA中配置maven
  5. 基于Python-turtle库绘制小猪佩奇、小猫咪
  6. Android Binder Debug
  7. ip扫描工具之traceroute/nmap/fping
  8. C++多态虚函数demo
  9. 使用wget从网上下载ubuntu源到互联网硬盘,拿到内部用
  10. 《算法图解》——狄克斯特拉算法