插入排序(形象类比)

最近在看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]。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/211531.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】卷积神经网络(CNN)的参数优化方法

著名&#xff1a; 本文是从 Michael Nielsen的电子书Neural Network and Deep Learning的深度学习那一章的卷积神经网络的参数优化方法的一些总结和摘录&#xff0c;并不是我自己的结论和做实验所得到的结果。我想Michael的实验结果更有说服力一些。本书在github上有中文翻译的…

ES 万条以外分页检索功能实现及注意事项

背景 以 ES 存储日志&#xff0c;且需要对日志进行分页检索&#xff0c;当数据量过大时&#xff0c;就面临 ES 万条以外的数据检索问题&#xff0c;如何利用滚动检索实现这个需求呢&#xff1f;本文介绍 ES 分页检索万条以外的数据实现方法及注意事项。 需求分析 用 ES 存储数…

二十二、数组(5)

本章概要 数组元素修改数组并行Arrays 工具类数组拷贝数组比较流和数组 数组元素修改 传递给 Arrays.setAll() 的生成器函数可以使用它接收到的数组索引修改现有的数组元素: ModifyExisting.java import java.util.Arrays;import static com.example.test.ArrayShow.show;pu…

vivado产生报告阅读分析17-时序报告13

CDC 拓扑结构的简化板级原理图 以下部分展示了 CDC 拓扑结构的简化板级原理图以及简要说明。在所有板级原理图中 &#xff0c; 源时钟信号线 &#xff08; 通常为 clk_a&#xff09; 以蓝色高亮 &#xff0c; 目标时钟信号线 &#xff08; 通常为 clk_b &#xff09; 以橙色…

Leaflet结合Echarts实现迁徙图

效果图如下&#xff1a; <!DOCTYPE html> <html><head><title>Leaflet结合Echarts4实现迁徙图</title><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

虚拟机VMware上安装Ubuntu系统(详细图文教程)

关于虚拟机VMware的安装教程&#xff0c;学者看我另外一篇博客&#xff1a;VMware详细安装教程 目录 一、Ubuntn系统准备二、VMware上安装Ubuntn系统2.1 答疑 三、导入Ubuntu系统四、总结 一、Ubuntn系统准备 先下载好Ubuntn系统&#xff0c;这里我提供一个&#xff0c;下载链…

蓝桥杯物联网竞赛_STM32L071_2_继电器控制

CubeMX配置&#xff1a; Function.c及Function.h&#xff1a; #include "Function.h" #include "gpio.h" void Function_LD5_ON(void){HAL_GPIO_WritePin(LD5_GPIO_Port, LD5_Pin, GPIO_PIN_RESET); }void Function_LD5_OFF(void){HAL_GPIO_WritePin(LD5_…

如何使用Fiddler进行弱网测试

测试APP、web经常需要用到弱网测试&#xff0c;也就是在信号差、网络慢的情况下进行测试。我们自己平常在使用手机APP时&#xff0c;在地铁、电梯、车库等场景经常会遇到会话中断、超时等情况&#xff0c;这种就属于弱网。 普通的弱网测试可以选择第三方工具对带宽、丢包、延时…

DAOS低时延与高性能RDMA网络

什么是RDMA RDMA&#xff08;Remote Direct Memory Access&#xff09;远程直接内存访问是一种技术&#xff0c;它使两台联网的计算机能够在主内存中交换数据&#xff0c;而无需依赖任何一台计算机的处理器、缓存或操作系统。与基于本地的直接内存访问 ( DMA ) 一样&#xff0c…

使用 PowerShell 中的命令来删除共享目录

Remove-SmbShare -Name "ShareName" 请将 "ShareName" 替换为您要删除的实际共享目录的名称。 请注意&#xff0c;执行此命令需要具有适当的权限。确保您以管理员身份运行 PowerShell 或具有足够的权限来删除共享目录。

AMESim|学习记录

此文记录AMESim学习过程中的各种情况。 目录 01 王佳. AUV 浮力调节系统设计及控制策略研究[D]. 天津大学, 2017.01 王佳. AUV 浮力调节系统设计及控制策略研究[D]. 天津大学, 2017. 01 王佳. AUV 浮力调节系统设计及控制策略研究[D]. 天津大学, 2017. 开始步入正文 01 王佳.…