插入排序过程详解

本文详细介绍了直接插入排序的工作原理,通过外层遍历取元素,内层寻找合适位置的过程,逐步完成排序。分别提供了C++和Python的实现代码,并强调在实现过程中需用额外变量保存待插入值,避免在移动元素时被覆盖。
摘要由CSDN通过智能技术生成

插入排序过程详解

1,引入

  • 插入排序是一个笼统的叫法,那些使用插入思路进行排序的算法都可以叫插入排序。

  • 这篇文章介绍其中最基础的一种——直接插入排序
    插入排序的几种

  • 直接插入排序虽然简单,但它包含插入排序这类算法的基本思路,对掌握其它复杂一点的插入排序算法很有帮助。

2,外层取元素,内层找位置

  • 如果下面实现部分的代码读不懂,请回来再多看几遍这个标题😎
  • 写大纲的时候,我用的标题是外层选元素,内层找位置,如果用可能会越俎代庖(选择排序💢),所以这里表示的是当前从左到右遍历到哪个元素便插入哪个元素
  • 直接插入排序的思路:给我们一组待排序的数,从左到右,先把第一个元素看成一组已经有序的数(一个元素自己自然有序),取第二个元素插到这组已经有序的数中,插入后使这组数仍然有序。然后再取第三个元素往这组仍然有序的数中插…直到把第n个元素插入到前n-1个有序的数中(n是元素个数)排序就完成了。
  • 有个问题:把一个数插入到一个已经有序的一组数中,让插入后的这组数仍然有序。不能随便找个位置插入,直接插入排序的做法很笨:拿这个待插入的数与组里的数挨个比较,直到找到一个不大于自己的(升序排序),然后就把自己安排在这个数后面。(如你所料,二分插入排序只是在找这个位置的时候使用了二分查找 !)
  • 文字说的啰嗦,看看图解:
  • 给定待升序序列0 5 3 2 4 7
    第一步
  • 第一步,我们把0看成自己的有序序列,将5插入,因为只有0一个元素,所以只比较一次就能确定应该插入的位置:
    第一次插入
  • 结果是什么也没发生,和起始数列一样,5仍然跟在0的后面。
  • 我们再尝试一步:
    第二次插入
  • 现在,在我们前一步形成的有序序列(0 5)中插入下一个元素(3),按照挨个比较的原则,35比较,小于关系,所以3至少应该排在5前面,这个时候我们把5往后移动一个
    小于关系,移动
  • 3继续和0比较,大于关系,这时我们知道3应该在0的后面,所以3的位置也就确定了,于是得到一个新的有序序列和待插入元素:
    第二步结果
  • 这里有个实现层面的问题:

5往后移动,程序里是赋值,现在处于这个位置的元素,也就是我们即将要插入的元素3的确被覆盖了,但是我们会用一个变量来记住我们当前待插入的元素。所以3不会丢失。上图中之所以用空来填充是方便理解,表示我们并不关心这里面的值,因为它们随时可能被其它值覆盖。下面这幅图可能更准确:

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值