漫画:什么是插入排序?

640?wx_fmt=jpeg

640?wx_fmt=jpeg



—————  第二天  —————



640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg



————————————



640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=jpeg


人们如何进行扑克牌的排序呢?


举个例子,比如我手中有红桃6,7,9,10这四张牌,已经处于升序排列:


640?wx_fmt=png


这时候,我又抓到了一张红桃8,如何让手中的五张牌重新变成升序呢?用冒泡排序,选择排序,亦或是快速排序?


640?wx_fmt=png


恐怕正常人打牌的时候都不会那么做。最自然也最简单的方式,是在已经有序的四张牌中找到红桃8应该插入的位置,也就是7和9之间,把红桃8插入进去:


640?wx_fmt=png



640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


给定无序数组如下:


640?wx_fmt=png


把数组的首元素5作为有序区,此时有序区只有这一个元素:


640?wx_fmt=png


第一轮

让元素8和有序区的元素依次比较。

8>5,所以元素8和元素5无需交换。


此时有序区的元素增加到两个:


640?wx_fmt=png


第二轮

素6和有序区的元素依次比较。

6<8,所以把元素6和元素8进行交换:


640?wx_fmt=png


6>5,所以把元素6和元素5无需交换。


此时有序区的元素增加到三个:


640?wx_fmt=png


第三轮

素3和有序区的元素依次比较。

3<8,所以把元素3和元素8进行交换:


640?wx_fmt=png


3<6,所以把元素3和元素6进行交换:


640?wx_fmt=png


3<5,所以把元3和元素5进行交换:


640?wx_fmt=png


此时有序区的元素增加到四个:


640?wx_fmt=png



以此类推,插入排序一共会进行(数组长度-1)轮,每一轮的结果如下:


640?wx_fmt=png


640?wx_fmt=jpeg


640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=jpeg


什么意思呢?让我们以第三轮举例:


640?wx_fmt=png


在第三轮操作中,我们需要让元素3逐个与有序区的元素进行比较和交换,与8交换、与6交换、与5交换,最终交换到有序区的第一个位置。


但是我们并不需要真的进行完整交换,只需把元素3暂存起来,再把有序区的元素从左向右逐一复制。


第一步,暂存元素3:


640?wx_fmt=png


第二步,和前一个元素比较,由于3<8,复制元素8到它下一个位置:


640?wx_fmt=png


第三步,和前一个元素比较,由于3<6,复制元素6到它下一个位置:


640?wx_fmt=png


第四步,和前一个元素比较,由于3<5,复制元素5到它下一个位置:


640?wx_fmt=png


第五步,也是最后一步,把暂存的元素3赋值到数组的首位:


640?wx_fmt=png


显然,这样的优化方法减少了许多无谓的交换。



640?wx_fmt=jpeg

640?wx_fmt=jpeg


 
 


640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg


640?wx_fmt=jpeg


—————END—————




喜欢本文的朋友,欢迎关注公众号 程序员小灰,收看更多精彩内容


640?wx_fmt=jpeg


欢迎长按二维码关注 小灰学英语,你所学到的不只是英语!


640?wx_fmt=jpeg


  • 192
    点赞
  • 425
    收藏
    觉得还不错? 一键收藏
  • 22
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值