漫画:什么是插入排序?

举报
xenia 发表于 2019/10/21 18:05:07 2019/10/21
【摘要】 ————— 第二天 —————————————————人们如何进行扑克牌的排序呢?举个例子,比如我手中有红桃6,7,9,10这四张牌,已经处于升序排列:这时候,我又抓到了一张红桃8,如何让手中的五张牌重新变成升序呢?用冒泡排序,选择排序,亦或是快速排序?恐怕正常人打牌的时候都不会那么做。最自然也最简单的方式,是在已经有序的四张牌中找到红桃8应该插入的位置,也就是7和9之间,把红桃8插入进...


640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1



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



640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1



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



640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


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


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1



640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


给定无序数组如下:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


第一轮

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

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


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


第二轮

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

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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


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


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


第三轮

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

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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1



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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


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


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


第一步,暂存元素3:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


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


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


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



640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

1.png

640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1


640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

本文转载自公众号【程序员小灰】

原文链接:https://mp.weixin.qq.com/s/McqFXkXucSZldjU46t5cdw

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。