插入排序(形象类比)
最近在看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]。
相关文章:
插入排序(形象类比)
最近在看riscv手册的时候,里面有一段代码是插入排序,但是单看代码的时候有点迷,没看懂咋操作的,后来又查资料复习了一下,最终才把代码看明白,所以写篇博客记录一下。 插入排序像打扑克牌 这是我听到过比较形…...
ElasticSearch 同步的方式
ElasticSearch 同步的方式 ElasticSearch是一款强大的分布式搜索和分析引擎,支持多种方式同步数据和日志。下面介绍几种常见的同步方式: 1. Logstash Logstash 是 ElasticStack 的一部分,用于收集、处理和转发日志和事件数据。通过配置 Lo…...
easyExcel实现分批导入,动态表头分批导出,以及导出表格样式设置
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency> 一,分批导入 1.首先配置表格头映射类 Getter Setter EqualsAndHashCode public class …...
Android BottomNavigationView底部菜单栏文字显示问题
1. BottomNavigationView 如果tab栏数据小于等于3个,那么图标和文字都是展示出来; 2. BottomNavigationView 如果tab栏数据大于3个,那么图标会显示出来,但是文字会隐藏; 3. 解决方式: (当底部…...
从零开始学习typescript——运算符(条件运算法、逻辑运算符、类型运算符、位运算)
条件运算符 条件运算符是一个根据条件返回不同运算结果的运算符 关键字:?: 三元运算符 它可以换成if …else 判断 ? true : false 判断为true,返回?号后面的,判断为false ,返回: 号后面的 逻辑运算符 用…...
【开源】基于Vue.js的康复中心管理系统
项目编号: S 056 ,文末获取源码。 \color{red}{项目编号:S056,文末获取源码。} 项目编号:S056,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员…...
抢先看|第二届世界直播电商大会邀您共话时代“新电商”
党的二十大报告指出,要加快发展数字经济,促进数字经济和实体经济深度融合。要深化国家数字经济创新发展试验区建设,打造一批具有国际竞争力的战略性新兴产业集群和数字产业集群。电子商务作为数字经济中规模最大、表现最活跃、发展势头最好的…...
火爆火爆!影响超250万读者,Python入门圣经全新升级!
人生苦短,快学Python! 什么?你没用过,也没开始学习,甚至没有认真了解过这门语言?那你一定这一秒就开始发力——下面让我们先简单看看 Python 有多火。权威编程语言排行榜 TIOBE,2022 和 2023 都…...
大数据学习(23)-hive on mapreduce对比hive on spark
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
通过这个简单的技巧让我们的 JavaScript 代码变得异常快
通过这个简单的技巧让我们的 JavaScript 代码变得异常快 秘诀:了解JavaScript 虚拟机(VM)的内部工作原理。 首先,我们来谈谈像 V8 这样的JavaScript 虚拟机(VM)。可以把它想象成我们的操作的大脑 —— 它将我们简洁的代码变成计算机可以理解和执行的东…...
vue怎么实现国际化? vue-i18n 插件实现国际化,支持切换不同语言
依赖的文档开始 | Vue I18n 一、安装 npm install vue-i18n 如果在一个模块系统中使用它,你必须通过 Vue.use() 明确地安装 vue-i18n: import Vue from vue import VueI18n from vue-i18nVue.use(VueI18n)二、使用 在 src 下创建 lang 文件夹 1.准…...
rabbit MQ的延迟队列处理模型示例(基于SpringBoot延时插件实现)
rabbitMQ安装插件rabbitmq-delayed-message-exchange 交换机由此type 表示组件安装成功 生产者发送消息时设置延迟值 消息在交换机滞纳至指定延迟后,进入队列,被消费者消费。 组件注解类: package com.esint.configs;import org.springfra…...
虽不想承认,但这就是CSGO游戏搬砖行业的现状
CSGO搬砖日常出货更新 其实整个搬砖市场,现在已经变得乌烟瘴气,散发着“恶臭”。我个人非常鄙视那些虚有其表,大小通吃的做法,那些甚至连搬砖数据都看不懂的人,也出来吹嘘着“实力强大,经验丰富”。这个世界…...
想问问各位大佬,网络安全这个专业普通人学习会有前景吗?
网络安全是一个非常广泛的领域,涉及到许多不同的岗位。这些岗位包括安全服务、安全运维、渗透测试、web安全、安全开发和安全售前等。每个岗位都有自己的要求和特点,您可以根据自己的兴趣和能力来选择最适合您的岗位。 渗透测试/Web安全工程师主要负责模…...
uniapp IOS从打包到上架流程(详细简单) 原创
1.登入苹果开发者网站,打开App Store Connect 2.新App的创建 点击我的App可以进入App管理界面,在右上角点击➕新建App 即可创建新的App,如下图: 3.app基本信息填写 新建完App后,需要填写App的基本信息&…...
React Native项目接入Sentry指南
本文主要介绍React Native项目接入Sentry流程,以及遇到的一些注意点,方便大家去解决和处理,如果在接入过程中,遇到任何问题可以在评论区留言,我将根据自己的接入经验给出一些解决方案和建议。 1, 安装sentry sdk 我们可以在项目中执行如下命令来安装sentry,命令如下: …...
首批!创邻科技入选《图数据库金融应用场景优秀案例》
11月11日,“全球金融科技中心网络年会”在第三届全球金融科技大会暨第五届成方金融科技论坛上成功在京举办。会上,北京前沿金融监管科技研究院发布了基于国际标准组织——国际关联数据基准委员会(LDBC)的《图数据库金融应用场景优…...
WPF树形控件TreeView使用介绍
WPF 中的 TreeView 控件用于显示层次结构数据。它是由可展开和可折叠的 TreeViewItem 节点组成的,这些节点可以无限嵌套以表示数据的层次。 TreeView 基本用法 例如实现下图的效果: xaml代码如下: <Window x:Class"TreeView01.Mai…...
Django 模型和Admin站点管理(三)
一、定义模型 (1) 创建模型类,必须要继承自 models.Model from django.db import models# Create your models here. #设计数据库 #创建模型 class UserModel(models.Model):namemodels.CharField(max_length30) #对应于SQL name varchar(30…...
JVMj之console Java监视与管理控制台
jconsole Java监视与管理控制台 1、jconsole介绍 jconsole (java monitoring and management console)是一款基于JMX (Java Management Extensions) 的可视化监视和管理工具。 2、启动jconsole 1、在linux和windwos下通过jconsole启动即可。 2、然后会自动搜索本机运行的…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
