我的机器学习教程「美团」算法工程师带你入门机器学习  以及 「三分钟系列」数据结构与算法  已经开始更新了,欢迎大家订阅~这篇专栏整合了这几年的算法知识,简单易懂,也将是我实体书的BLOG版。

欢迎大家扫码关注微信公众号「图灵的猫」,除了有更多AI、算法、Python相关文章分享,还有免费的SSR节点和外网学习资料。其他平台(微信/知乎/B站)也是同名「图灵的猫」,不要迷路哦~

作为简单排序中最重要的排序方法,插入排序和它的变型在几乎所有混合排序算法(如快速排序,归并排序,TIM排序)中起到了重要作用。今天我们就来看看插入排序的思想及实现。

一、算法思想

作为常用的排序,插入排序具有稳定性,适应性(有序数组的非退化)的好处,其中最常用的版本是直接插入排序,另一版本是是二分插入排序。这里我们先谈谈直接插入排序。

首先,插排是基于比较的排序,具有O(nlongn)的理论下界。而所谓的基于比较,就是通过比较数组中的元素,看谁大谁小,根据结果来调整元素的位置。因此,对于这类排序,就有两种基本的操作:①比较操作; ②交换操作

算法的基本思想是每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。其中,对于交换操作,可以优化成移动操作,即不直接进行两个元素的交换,还是用一个枢轴元素(tmp)将当前元素先保存起来,然后执行移动操作,待确定了最终位置后,再将当前元素放入合适的位置。有些排序算法,比较次数比较多,而移动次数比较少,而有些则相反。比如,归并排序和快速排序,前者移动次数比较多,而后者比较次数比较多。

二、算法步骤

插入排序的基本思想是在遍历数组的过程中,假设在序号 i (i>=1)之前的元素即 [0..i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,并且在寻找这个位置 k 的过程中逐个将比较过的元素往后移一位,为元素 x “腾位置”,最后将 k 对应的元素值赋为 x ,一般情况下,插入排序的时间复杂度和空间复杂度分别为O(n2) 和 O(1)。(通俗说法:把数组后面那些没排序的元素换到数组前面已经排好序的部分里对应的位置)

例如:45 80 48 40 22 78

第一轮:45 [80] 48 40 22 78 ---> 45 80 48 40 22 78 i=1
第二轮:45 80 [48] 40 22 78 ---> 45 48 80 40 22 78 i=2
第三轮:45 48 80 [40] 22 78 ---> 40 45 48 80 22 78 i=3
第四轮:40 45 48 80 [22] 78 ---> 22 40 45 48 80 78 i=4
第五轮:22 40 45 48 80 [78] ---> 22 40 45 48 78 80 i=5
插入排序算法由N-1趟排序组成。初始时,只考虑数组下标0处的元素,只有一个元素,显然是有序的

第一趟 对下标 1 处的元素进行排序,保证数组[0,1]上的元素有序;

第二趟 对下标 2 处的元素进行排序,保证数组[0,2]上的元素有序;

..........

第N-1趟对下标 N-1 处的元素进行排序,保证数组[0,N-1]上的元素有序,也就是整个数组有序了。它的递归思想就体现在:当对位置 i 处的元素进行排序时,[0,i-1]上的元素一定是已经有序的了。

三、复杂度分析

排序方法 时间复杂度 空间复杂度 稳定性 复杂性
平均情况 最坏情况 最好情况
插入排序 O(n2) O(n2) O(n) O(1) 稳定 简单

这里的最坏的情况和平均情况从代码中就可以看出来,这个就是对于一个有序的序列来说,不需要进行交换,只是比较了n次,所以这里最好的时间复杂度就是O(n)。此外对于这个表,我是从另一篇博客里引用的,但是表中的空间复杂度有问题,原来为O(n),但实际上因为插排所引用的只是一个tmp变量,所以复杂度应该是O(1)。

其实,插入排序的比较次数与数组的逆序数相关,因为插入排序在将某个元素插入到合适位置时消除这个元素的逆序数。由定理:N个互异数的数组的平均逆序数是 N(N-1)/4,可知:基于相邻元素之间的比较和交换的算法的时间复杂度的一个下界为O(N^2)
此外,还有另外一个高效的排序算法:希尔排序,采用了增量序列。因此,它可能获得一个更好的时间复杂度。比如,当希尔排序使用Hibbard增量序列时,它的最坏运行时间为O(N3/2)

四、算法实现

代码在VC++环境下编译通过

/*Insert排序数组测试:2018/03/17version: 直接插入排序
*/#include <stdio.h>
#include <stdlib.h>#ifndef N
#define N 100
#endif // Nint arr[N];inline int Insert_Sort( int *arr)
{register int i, j, tmp;int k;//int len = sizeof(arr);for(i = 1; i < N/10; i++){printf("\n");printf("The %dth times is: \n", i);tmp = arr[i];j = i - 1;while( tmp < arr[j] && j >= 0){arr[j + 1] = arr[j];j--;}arr[j + 1] = tmp;for(k = 0;k < N/10;k++){printf("%2d |", arr[k]);}}
}int main( int argc, int *argv[])
{int i;printf("please enter 10 numbers: \n");for(i = 0;i < N/10;i++){scanf("%d", &arr[i]);}Insert_Sort(arr);printf("\n");printf("the ordered array is: \n");for(i = 0;i < N/10;i++){printf("%4d", arr[i]);}
}

输入:

5  11  23   7  8  42  9  10  6  3

输出:

有趣的算法(六):3分钟看懂插入排序(C语言实现)相关推荐

  1. 量子计算机 漫画,漫画 | 10分钟看懂量子比特、量子计算和量子算法

    原标题:漫画 | 10分钟看懂量子比特.量子计算和量子算法 请做好准备,即将进入烧脑模式! 宏观世界的生活经验很多都是表象.比如,你可能认为世界的运行是确定的.可预测的:一个物体不可能同时处于两个相互 ...

  2. 十分钟看懂图像语义分割技术

    转载于:十分钟看懂图像语义分割技术 大多数人接触"语义"都是在和文字相关的领域,或语音识别,期望机器能够识别你发出去的消息或简短的语音,然后给予你适当的反馈和回复.嗯,看到这里你应 ...

  3. java和python的web自动化有什么区别-三分钟看懂Python和Java的区别

    随着人工智能的火爆,Python和Java一直在各种流行编程语言中名列前茅.其实Java和Python有些相似,因为很多编程语言之间是互通的.Java现在还是第一,不知道Python未来会不会超越Ja ...

  4. python和java一样吗-三分钟看懂Python和Java的区别

    随着人工智能的火爆,Python和Java一直在各种流行编程语言中名列前茅.其实Java和Python有些相似,因为很多编程语言之间是互通的.Java现在还是第一,不知道Python未来会不会超越Ja ...

  5. python和java的区别-三分钟看懂Python和Java的区别

    随着人工智能的火爆,Python和Java一直在各种流行编程语言中名列前茅.其实Java和Python有些相似,因为很多编程语言之间是互通的.Java现在还是第一,不知道Python未来会不会超越Ja ...

  6. 危骆邦油邦快讯|一分钟看懂山东地炼成品油报价

        昨日山东地炼汽柴油价格以下调为主,汽油主流跌幅在80-160元/吨,柴油主流跌幅在70-120元/吨.预计今日山东地炼汽柴油价格继续稳中下调,累计调价幅度或在20元/吨-100元/吨. 昨天7 ...

  7. 【游戏客户端】5分钟看懂商店拍卖系统

    [游戏客户端]5分钟看懂商店&拍卖系统     大家好,我是Lampard~~     最近刚研究完图的最短路径算法[20分钟回顾四大寻路算法],现在终于有空腾出时间写一篇游戏系统的分享了. ...

  8. 图像拾取点_10分钟看懂Photoshop 照片修饰(用“消失点”滤镜编辑照片)

    "消失点"滤镜具有特殊的功能,它可以在包含透视平面(如建筑物侧面或热和矩形对象)的图像中进行透视校正.在应用诸如绘画.仿制.拷贝或粘贴,以及变换等编辑操作时,Photoshop可以 ...

  9. 怎么看到方法内引用方法的注释_网页内文字无法复制怎么办?一分钟看懂这些方法,让你随意复制...

    网页内文字无法复制怎么办?一分钟看懂这些方法,让你随意复制 现在的生活中,无论你是一名上班族还是学生或者什么职业,遇到不会的问题,总是需要上网查资料,找到某些好用的资料,却因为某些原因需要付费才能复制 ...

  10. 三相逆变器双pi控制器参数如何调节_一分钟看懂维也纳三相整流器

    欢迎加入技术交流QQ群(2000人):电力电子技术与新能源 1105621549 高可靠新能源行业顶尖自媒体 在这里有电力电子.新能源干货.行业发展趋势分析.最新产品介绍.众多技术达人与您分享经验,欢 ...

最新文章

  1. php 抽象类 接口 区别,PHP中抽象类、接口的区别与选择分析
  2. Altium Designer 发现的机密
  3. 无线技术之WLAN八个常见问题解答(收藏)
  4. 翻译文章第六章8-11
  5. shelve模块简单用法
  6. DataBase 之 数据库设计六大范式
  7. Gartner:当商业智能成熟度低时,如何加快分析采用率
  8. Sybase的安装、配置及使用(五)
  9. 网络安全协议(三)--基本安全协议
  10. 关于微服务中用户身份认证的一点愚见
  11. 下载频道2013上半年超人气精华资源汇总---全都是免积分下载
  12. 网线8芯线各自作用是什么?几种常用的网线定义行业标准
  13. 【JZOJ100208】【20190705】传说之下
  14. 平台服务器型号,云平台服务器型号
  15. MongoDB 分片总结
  16. 智能插座_如何重置您的ConnectSense智能插座
  17. 平面图的基本概念及性质
  18. TensorFlow实战之Softmax Regression识别手写数字
  19. 人员招聘与培训实务【4】
  20. ethtool Linux网卡详解

热门文章

  1. 几种.NET平台数据持久化框架介绍
  2. 如何养成周回顾习惯的回复
  3. ESP8266-01/01S配对阿里云生活物联网教程(超详细)
  4. CityMaker SDK与三维GIS城市
  5. springmvc工作原理和源码分析
  6. 自由职业者的八大挑战
  7. Python中的正斜杠与反斜杠
  8. Python学习笔记(十三)文件操作函数
  9. FATA[0000] (省略) Are you trying to connect to a TLS-enabled daemon without TLS?
  10. 为什么要关闭数据库连接,可以不关闭吗?