==算法主要衡量标准==


  • 时间复杂度(运行时间)

在算法时间复杂度维度,我们主要对比较和交换的次数做对比,其他不交换元素的算法,主要会以访问数组的次数的维度做对比。

其实有很多同学对于算法的时间复杂度有点模糊,分不清什么所谓的 O(n),O(nlogn),O(logn)...等,也许下图对一些人有一些更直观的认识。

  • 空间复杂度(额外的内存使用)

排序算法的额外内存开销和运行时间同等重要。 就算一个算法时间复杂度比较优秀,空间复杂度非常差,使用的额外内存非常大,菜菜认为它也算不上一个优秀的算法。

  • 结果的正确性

这个指标是菜菜自己加上的,我始终认为一个优秀的算法最终得到的结果必须是正确的。就算一个算法拥有非常优秀的时间和空间复杂度,但是结果不正确,又有什么意义呢?

==原理==


每次在无序的列表中取一个元素插入到一个有序列表的适当位置,成为一个元素加1的新的有序列表。

插入排序根据原理又分为 直接插入排序、二分插入排序、希尔排序等,今天主要讲一下直接插入排序。直接插入排序是一种稳定的排序算法

假设排序顺序从左至右,具体步骤如下:

  1. 列表第一个元素和前面元素比较,如果小于前面元素(其实不存在),则交换位置。(这步其实可以没有)
  2. 列表第二个元素和前面元素(第一个元素)比较,如果小于前面元素,则交换位置。
  3. 列表第三个元素和前面元素(第二个元素)比较,如果小于前面元素,则交换位置。如果和前面元素交换了位置,现在在第二个位置上,则接着继续和前面元素比较(第一个元素),如果小于前面元素,接着再次交换位置,然后再次重复比较过程....

...继续重复以上过程,直到最后一个元素完成比较

比较移动过程中,如果元素不需要移动意味着该元素排序完毕。

++网络上的插入排序大多都是新建一个有序列表用来存放最终结果,其实在无序列表上进行排序操作空间复杂度才更优++

也许一张更直观的图比上千句话效果都好:

==复杂度==

  • 时间复杂度
  1. 比较次数

对于长度为N的主键不重复的列表,插入排序 平均情况下需要n²/4次比较,最坏情况下需要n²/2次比较,最好的情况下需要n-1 次比较。

  1. 交换次数

对于长度为N的主键不重复的列表,插入排序平均情况下需要n²/4次交换,最坏情况下需要n²/2次交换,最好情况下需要0次交换。

==性能和特点==


总体来说,直接插入排序是一种比较简单的排序算法,很容易理解也很好用代码实现,当然他的特点也很明显:

运行时间和数据初始状态有关

插入排序的思想是把一个元素插入一个有序的列表中,假如这个元素的位置正好是有序部分的末尾呢?也就是说当前元素不用移动位置。 再一次假如整个列表都是有序的会发生什么情况呢?根本就不需要移动任何元素。这也就是为什么在最好的情况下交换次数为0,比较次数为n-1的原因。

假如列表的很大一部分元素是有序的,插入排序可能比大多数排序算法都要快。

==适用场景==

直接插入排序对于小型列表或者非随机元素列表很有效。例如:部分元素有序。大体可归纳为:

  1. 每个元素距离自己的最终位置都不远。
  2. 一个有序的大列表连接一个小列表。
  3. 列表中只有少数元素不正确。

==其他==

  • 为什么插入排序是稳定呢?

插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

==实现案例==

  • c#
         static void Main(string[] args){List<int> data = new List<int>() ;for (int i = 0; i < 10; i++){data.Add(new Random(Guid.NewGuid().GetHashCode()).Next(1, 100));}//打印原始数组值Console.WriteLine($"原始数据: {string.Join(",", data)}");int n = data.Count;//此处可以直接从第二个元素开始for (int i = 1; i < n; i++){               //查找最小的元素的索引for (int j = i; j>0  ; j--){if (data[j] < data[j - 1]){//异或法 交换两个变量,不用临时变量data[j] = data[j] ^ data[j-1];data[j-1] = data[j] ^ data[j - 1];data[j ] = data[j] ^ data[j - 1];}}}//打印排序后的数组Console.WriteLine($"排序数据: {string.Join(",", data)}");Console.Read();}
复制代码

运行结果:

原始数据: 72,78,42,60,84,74,60,79,72,52

排序数据: 42,52,60,60,72,72,74,78,79,84

Go

家里没环境,还得翻墙,以后再补上吧,望见谅。


独乐不如众乐

我表弟在追学校的一个女生,每天短信无数,可那妞从来都不回他。我对他说:骚年!女人的天性只是八卦和好奇心!就你这样还想泡妞呢!看你表哥的!我用他手机给那妞发:你是我们学校三大美女之一,但我只喜欢你。半分钟之后,那妞就回了:另外两个是谁,你为什么只喜欢我啊?

添加关注,查看更精美版本,收获更多精彩

转载于:https://juejin.im/post/5cafe94b5188251b2f3a521f

程序猿修仙之路--算法之直接插入排序相关推荐

  1. 程序猿修仙之路--数据结构之你是否真的懂数组?

    数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少.数据结构与算法相辅相成,亦是阴阳互补之法. 开篇 说 ...

  2. 程序猿修仙之路--数据结构之你是否真的懂数组? c#socket TCP同步网络通信 用lambda表达式树替代反射 ASP.NET MVC如何做一个简单的非法登录拦截...

    程序猿修仙之路--数据结构之你是否真的懂数组? 数据结构 但凡IT江湖侠士,算法与数据结构为必修之课.早有前辈已经明确指出:程序=算法+数据结构  .要想在之后的江湖历练中通关,数据结构必不可少.数据 ...

  3. 程序猿修仙之路--数据结构之设计高性能访客记录系统

    准备加班中ing- 需求要点 每个用户都有自己的个人空间,当有其他用户来访问的时候,需要添加访客记录,并且更新为最新的访客,这里设计到一个坑,如果存在这个用户的访问记录需要更新用户的最后访问时间.那这 ...

  4. 程序员修仙之路--高性能排序多个文件

    点击上方蓝色字体,关注我们 菜菜呀,昨天晚上班级空间崩溃了 程序员主力 Y总 what? 菜菜 我看服务器上写了很多个日志文件,我看着太费劲了,能不能按照日期排序整合成一个文件呀? 程序员主力 Y总 ...

  5. 程序员修仙之路--把用户访问记录优化到极致

    点击上方蓝色字体,关注我们 菜菜呀,前几天做的用户空间,用户反映有时候比较慢呀 CEO,CTO,CFO于一身的CXO 是吗? 菜菜 我把你拉进用户反馈群,你解决一下呀 CEO,CTO,CFO于一身的C ...

  6. 程序员修仙之路-数据结构之 CXO让我做一个计算器

    菜菜呀,个税最近改革了,我得重新计算你的工资呀,我需要个计算器,你开发一个吧 CEO,CTO,CFO于一身的CXO X总,咱不会买一个吗? 菜菜 那不得花钱吗,一块钱也是钱呀··这个计算器支持加减乘除 ...

  7. 程序员修仙之路--设计一个实用的线程池

    菜菜呀,我最近研究技术呢,发现线上一个任务程序线程数有点多呀 CEO,CTO,CFO于一身的CXO x总,你学编程呢? 菜菜 作为公司总负责人,我以后还要管理技术部门呢,怎么能不会技术呢 CEO,CT ...

  8. 实现pv uv统计_程序员修仙之路优雅快速的统计千万级别uv

    菜菜,咱们网站现在有多少PV和UV了? Y总,咱们没有统计pv和uv的系统,预估大约有一千万uv吧 写一个统计uv和pv的系统吧 网上有现成的,直接接入一个不行吗? 别人的不太放心,毕竟自己写的,自己 ...

  9. 程序员修仙之路--优雅快速的统计千万级别uv

    菜菜,咱们网站现在有多少PV和UV了? Y总,咱们没有统计pv和uv的系统,预估大约有一千万uv吧 写一个统计uv和pv的系统吧 网上有现成的,直接接入一个不行吗? 别人的不太放心,毕竟自己写的,自己 ...

最新文章

  1. EasyUI combobox 中文无法检索最终解决方案!
  2. JVM-10虚拟机性能监控与故障处理工具之【JDK的命令行】
  3. 英文期刊论文写作工具入门
  4. Linux驱动开发必看详解神秘内核(完全转载)
  5. msyql开启慢查询以及分析慢查询
  6. Class.forName和ClassLoader有什么区别
  7. 工控软件图形界面-控件实现(圆形仪表控件三)(zz)
  8. Spring Cloud与Docker微服务架构实战--阅读笔记
  9. sql-server-storage-internals
  10. 怎么将webm格式转换为mp4
  11. 一个简单实用的boost升压电路
  12. illumina平台的一些扩增子测序项目介绍
  13. 帆软按钮控件变查询_JS使用填报页面的控件查询
  14. 极简步骤试玩Ant Design Pro myapp demo
  15. 怎么去除新装修房子的甲醛
  16. java杨戬的角色_非人哉:游戏角色反映了神仙们的爱好,杨戬太让人意外了
  17. 信创操作系统--统信UOS桌面版(使用终端:bash、tty、基本shell操作)
  18. 学习Ansible自动化
  19. MySQL查询最近7天数据
  20. 2021新宁二中高考喜报成绩查询,新宁各校高考喜报!最高分684,全县大获得丰收!看有你认识的吗?...

热门文章

  1. poj2112(网络流-最大流+二分)
  2. @property、@sythesize以及Ivar和@dynamic讲解(下)
  3. 【废弃】【WIP】JavaScript 函数
  4. (转)postman中 form-data、x-www-form-urlencoded、raw、binary的区别
  5. Android使用Application总结
  6. 编写高质量代码改善C#程序的157个建议——建议127:用形容词组给接口命名
  7. Linux 命令 - od
  8. hadoop 配置项的调优
  9. Oracle常用系统表
  10. 神经网络与机器学习 笔记—时序模式、非线性滤波