为了账号安全,请及时绑定邮箱和手机立即绑定

动画 | 什么是插入排序?

标签:
算法

插入排序

file

插入排序是比较简单也比较直接的一种排序算法。它是从一堆数据中取出一个数据并将它插入到已排序的数据中合适的位置。

比如按身高排队,有一个人指挥排队从第二个人开始,按身高把当前的人安插到之前排序好队的合适的位置。

或者打扑克牌,假设我们拿到了10,J,K,A这四张牌,然后拿到了Q这张牌,那如何让手中的五张牌变为升序呢?如果我们只学了冒泡排序和快速排序,初始状态是10,J,K,A,Q。

如果是用冒泡排序或者快速排序去做的话,那就可能不合适。结果是对,但是浪费了很多比较次数。

正常人最简单的方式就是,把Q安插到J和K之间就可以了。

file

插入排序正是如此,它的思想就是维护一个有序区,把元素一个一个插入到有序区中的合适的位置,直到所有元素有序为止。

视频动画
Code

file

Result

初始状态 [5, 1, 3, 7, 4, 6, 2]
发生交换 [1, 5, 3, 7, 4, 6, 2]
1趟 [1, 5, 3, 7, 4, 6, 2]
发生交换 [1, 3, 5, 7, 4, 6, 2]
2趟 [1, 3, 5, 7, 4, 6, 2]
3趟 [1, 3, 5, 7, 4, 6, 2]
发生交换 [1, 3, 5, 4, 7, 6, 2]
发生交换 [1, 3, 4, 5, 7, 6, 2]
4趟 [1, 3, 4, 5, 7, 6, 2]
发生交换 [1, 3, 4, 5, 6, 7, 2]
5趟 [1, 3, 4, 5, 6, 7, 2]
发生交换 [1, 3, 4, 5, 6, 2, 7]
发生交换 [1, 3, 4, 5, 2, 6, 7]
发生交换 [1, 3, 4, 2, 5, 6, 7]
发生交换 [1, 3, 2, 4, 5, 6, 7]
发生交换 [1, 2, 3, 4, 5, 6, 7]
6趟 [1, 2, 3, 4, 5, 6, 7]

插入排序优化,减少不必要的交换次数

回顾一下上面代码运行的结果,发现有很多次的交换,会有一点一点的时间上的消耗。如果我们做减少交换次数的代码,那如何去写呢?

回顾一下快速排序那篇文章,也使用了减少交换次数的方法。它是一个一个待比较完之后,定位最大的元素或者最小的元素,然后进行交换。

插入排序把待插入的元素做一个标记,和有序区一个一个元素去做比较。假设是从待插入元素的邻近元素开始比较(从后往前),符合条件的前一个元素去复制粘贴到待插入元素的地址。直到不符合条件才插入到合适的位置。

视频动画
Code

file

Result

初始状态 [5, 1, 3, 7, 4, 6, 2]
发生复制 [5, 5, 3, 7, 4, 6, 2]
1趟 [1, 5, 3, 7, 4, 6, 2]
发生复制 [1, 5, 5, 7, 4, 6, 2]
2趟 [1, 3, 5, 7, 4, 6, 2]
3趟 [1, 3, 5, 7, 4, 6, 2]
发生复制 [1, 3, 5, 7, 7, 6, 2]
发生复制 [1, 3, 5, 5, 7, 6, 2]
4趟 [1, 3, 4, 5, 7, 6, 2]
发生复制 [1, 3, 4, 5, 7, 7, 2]
5趟 [1, 3, 4, 5, 6, 7, 2]
发生复制 [1, 3, 4, 5, 6, 7, 7]
发生复制 [1, 3, 4, 5, 6, 6, 7]
发生复制 [1, 3, 4, 5, 5, 6, 7]
发生复制 [1, 3, 4, 4, 5, 6, 7]
发生复制 [1, 3, 3, 4, 5, 6, 7]
6趟 [1, 2, 3, 4, 5, 6, 7]

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消