当前位置: 首页 > news >正文

插入排序(形象类比)

最近在看riscv手册的时候,里面有一段代码是插入排序,但是单看代码的时候有点迷,没看懂咋操作的,后来又查资料复习了一下,最终才把代码看明白,所以写篇博客记录一下。

插入排序像打扑克牌

这是我听到过比较形象的一个比喻。在打扑克牌的时候,我们是一张一张去摸牌,然后将牌按照某种自己定义的顺序进行排序。下面我来类比一下:

  • 从牌堆顶将要摸取的10张牌  <->  待排序数组
  • 一张一张摸牌  <->  一个数一个数进行排序
  • 牌要么在牌堆中,要么在手中;数要么在待排序子数组中,要么在已排序子数组中
  • 在牌堆中的牌加上在手中的牌是所有牌;在待排序子数组中的数加上在已排序子数组中的数是所有数(换句话说 我们将所有牌(数)分为了牌堆牌(待排序数组)和手中牌(已排序数组)两部分)
  • 初始状态:手中无牌(已排序数组为空),牌(数)全在牌堆(待排序数组)中
  • 依次从牌堆(待排序数组)中取牌(数),拿取到的牌(数)与手中的最大的牌进行比较,如果大于,则直接放在手的最右边,否则就和次大的牌进行比较,直到找到这张牌的位置(不再进行具体的类比替换)
  • 直到牌堆中无牌,手中牌为排好序的牌

其实我咋说,都说不清,如果打牌的话,自己类比一下,会发现特别有意思。即使是a[j] = a[j-1]这一步,在摸牌时也有对应。下面我解释一下这行码。

比如说,我的手只能放10张牌,并且摸得牌都是从左到右以此放在我手上,所以我在比较大小的时候,如果这个牌比手里当前比较的牌小时,我会把手里当前比较的牌往后挪一下,给刚摸得牌放的空间。(我说的比较抽象 感觉还是需要想象 如果没打过扑克 可能不太好理解我在说啥)  

下面放一段正儿八经的插入排序的说明吧。

 插入排序是一种简单而有效的排序算法,它的基本思想是将一个元素插入到已经有序的序列中,从而得到一个新的、元素个数增加的有序序列。插入排序的过程可以类比于打扑克牌时,将摸到的牌按照大小顺序插入到手中的牌中。插入排序的平均时间复杂度是 O(n^2),空间复杂度是 O(1)。下面我用一些例子来详细解释插入排序的原理和步骤。

假设我们有一个数组 [6, 7, 9, 3, 1, 5, 4, 8],我们要对它进行升序排序。我们可以用以下的方法进行插入排序:

  • 首先,我们将数组的第一个元素 6 看作是一个已经有序的序列,将剩余的元素看作是未排序的序列。
  • 然后,我们从未排序的序列中取出第一个元素 7,与已排序的序列中的元素从后往前依次比较,如果 7 大于或等于已排序的元素,则将 7 插入到该元素的后面,否则继续比较。在这个例子中,7 大于 6,所以我们将 7 插入到 6 的后面,得到新的有序序列 [6, 7],未排序序列为 [9, 3, 1, 5, 4, 8]。
  • 接着,我们从未排序的序列中取出第一个元素 9,与已排序的序列中的元素从后往前依次比较,如果 9 大于或等于已排序的元素,则将 9 插入到该元素的后面,否则继续比较。在这个例子中,9 大于 7 和 6,所以我们将 9 插入到 7 的后面,得到新的有序序列 [6, 7, 9],未排序序列为 [3, 1, 5, 4, 8]。
  • 依此类推,我们每次从未排序的序列中取出第一个元素,与已排序的序列中的元素从后往前依次比较,找到合适的位置插入,直到未排序的序列为空,排序完成。最终的有序序列为 [1, 3, 4, 5, 6, 7, 8, 9]。

相关文章:

  • ubuntu修改系统语言
  • Windows系统管理之备份与恢复
  • PgSQL技术内幕-Analyze做的那些事-pg_stat_all_tables
  • Hibernate 脏检查和刷新缓存机制
  • 【开源】基于Vue.js的天然气工程运维系统的设计和实现
  • EMG肌肉信号处理合集 (一)
  • 【DP】mobiusp正在创作乐曲
  • ubuntu20.04配置OpenCV的C++环境
  • 深度学习之基于YoloV3杂草识别系统
  • GIT | 基础操作 | 初始化 | 添加文件 | 修改文件 | 版本回退 | 撤销修改 | 删除文件
  • 操作系统 应用题 例题+参考答案(考研真题)
  • 【Ambari】HDFS基于Ambari的常规运维
  • 基于C#实现赫夫曼树
  • ②⑩② 【读写分离】Sharding - JDBC 实现 MySQL读写分离[SpringBoot框架]
  • Mysql并发时常见的死锁及解决方法
  • python3.6+scrapy+mysql 爬虫实战
  • 时间复杂度分析经典问题——最大子序列和
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 11111111
  • HTTP中的ETag在移动客户端的应用
  • LeetCode算法系列_0891_子序列宽度之和
  • Linux后台研发超实用命令总结
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Objective-C 中关联引用的概念
  • Python socket服务器端、客户端传送信息
  • Python 反序列化安全问题(二)
  • rc-form之最单纯情况
  • SpiderData 2019年2月13日 DApp数据排行榜
  • 关于for循环的简单归纳
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 开源地图数据可视化库——mapnik
  • 排序算法学习笔记
  • 区块链技术特点之去中心化特性
  • 我的业余项目总结
  • 学习HTTP相关知识笔记
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • (06)金属布线——为半导体注入生命的连接
  • (3)llvm ir转换过程
  • (ibm)Java 语言的 XPath API
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (六)Hibernate的二级缓存
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)visual stdio 书签功能介绍
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET 使用 XPath 来读写 XML 文件
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • //解决validator验证插件多个name相同只验证第一的问题
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)