插入排序详细解读

news/2024/9/12 21:12:48/文章来源:https://www.cnblogs.com/bianchengxue/p/18372687

插入排序详细解读

图解

第一轮:从第二位置的 6 开始比较,比前面 7 小,交换位置。

img

第二轮:第三位置的 9 比前一位置的 7 大,无需交换位置。

img

第三轮:第四位置的 3 比前一位置的 9 小交换位置,依次往前比较。

img

第四轮:第五位置的 1 比前一位置的 9 小,交换位置,再依次往前比较。

img

......

就这样依次比较到最后一个元素。

步骤解读:

STEP 1:【模拟后面待排序元素】

我们需要有一个外层循环,来不断的将后面新的待排元素进行变换,会不断的取第二个,取第三个.......;(待排元素可以从索引1开始,因为索引1左侧就一个数据,是索引0是有顺序的)

#include<iostream>
using namespace std;
int main() {int arr[100] = {7, 6, 9, 3, 1, 5, 2, 4};for (int i = 1; i <= 7; i++) {}
}

STEP 2:【用j变量来记录排好序列部分的最后一个位置】

接下来我们需要定义一个变量j来记录我们的合适位置,(这个j变量会拥有一个特点,什么特点呢?i刚刚已经写了是索引1,j的话就是索引0开始,所以一开始就是i-1),待排序的元素就是已经吸收了arr[i]变量key

#include<iostream>
using namespace std;
int main() {int arr[100] = {7, 3, 5, 5, 6, 0, 8};for (int i = 1; i <= 6; i++) {int key = arr[i];int j = i-1;}
}

STEP 3:【启动条件&启动后模拟值的交换过程】

书写我们的启动条件,如果当前这个元素前一个元素小,呢就往前放;写成代码就是if(arr[j] > key)

达成这个条件后我们开始比较操作;

操作的主要内容是:(1.交换元素位置 2.寻找合适位置(变量j的值能体现,因为在不断的变小,往前去找))

#include<iostream>
using namespace std;
int main() {int arr[100] = {7, 3, 5, 5, 6, 0, 8};for (int i = 1; i <= 6; i++) {int key = arr[i];int j = i-1;while (arr[j] > key) {arr[j+1] = arr[j];j--;}}
}

STEP 4:【回首掏,有几个情况需要考虑】

对于第三步,我们反思一下可能会出现几个问题:

  1. 【最后元素缺失】后面的值被前面的值覆盖,刚刚为key的位置元素没了,所以我们需要用arr[j + 1] = key;来给他补上
  2. 【历史最小元素,防止数组越界】加入出现了一个,“历史最小元素”,你要排到索引0这个位置,你不可能排到-1嘛,否则将会出现数组的索引错误。我们需要在判断条件上加上j >= 0
  3. 这个时候我再来解释一下key为什么会被用到,因为第一条问题【最后元素缺失】
#include<iostream>
using namespace std;
int main() {int arr[100] = {7, 3, 5, 5, 6, 0, 8};for (int i = 1; i <= 6; i++) {int key = arr[i];int j = i-1;while (j >= 0 && arr[j] > key) {arr[j+1] = arr[j];j--;}//while 结束之后key的位置就找到了arr[j + 1] = key;//但是此时,j+1会被覆盖}
}

至此排序完成,自己输出就好了!

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

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

相关文章

一张图看懂SAP主要流程

一张图看懂SAP主要流程

第一章 redis简单介绍

一、引言 在Web应用发展的初期,那时关系型数据库受到了较为广泛的关注和应用,原因是因为那时候Web站点基本上访问和并发不高、交互也较少。而在后来,随着访问量的提升,使用关系型数据库的Web站点多多少少都开始在性能上出现了一些瓶颈,而瓶颈的源头一般是在磁盘的I/O上。而…

第17章_反射机制

该篇笔记,是因为想重新学一下Spring Cloud 和Spring Cloud Alibaba框架,但是b站尚硅谷的最新课程,使用SpringBoot3作为,单体服务的框架,而SpringBoot3最低要求JDK17,所以必须要学一下JDK8-JDK17之间的新特性。本来只想看,宋红康老师课程的第18章JDK8-17新特性,但是觉得…

qt静态编译 全自动编译qt静态库 qt5 windows安装qt (2024.2.23)

全自动编译qt5静态库(2024.2.23) 本教程是从无到有配置qt.io和vcpkg实现全自动编译qt5的静态库,使得您可以静态编译qt项目 0. 安装Visual Studio 2022 这个我就不多解释了,直接去官网下载社区版本,勾选使用C++的桌面开发安装好就行 1. 安装qt.io的开发环境 1.1 下载在线安装…

【python】面向对象之类成员(字段,方法)

1.类的成员可以分为三大类:字段、方法和属性注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份。2.字段字段包括:普通字段和静态字段,他们…

2024.8.21

DATE #:20240821 ITEM #:DOC WEEK #:WEDNESDAY DAIL #:捌月拾捌TAGS< BGM = "琴师--要不要买菜" > < theme = oi-contest > < [NULL] > < [空] > < [空] >``` 此情可待成追忆,只是当时已惘然 -- 《锦瑟》 李商隐 ```T1 试卷答案(ex…

回溯part011

今天学习了回溯算法:基本知识,关键是那个模板 组合问题:画树状图+简单的剪枝 电话号码的组合问题,和经典组合问题的差别在于取不同集合中的组合,注意如何有限制的在for循环之前确定循环哪个数组,通过树状图确定for循环中i的大小。1. 基本知识回溯法也可以叫做回溯搜索法,…

『模拟赛』暑假集训CSP提高模拟26

『模拟赛记录』暑假集训CSP提高模拟26Rank 打得一般,倒数第二场了。。A. 博弈 直接搬了牛客的一套题。 一眼没思路,模了一会放弃直接去打 T2 了,后来把 \(\mathcal{O(n^2)}\) 暴力 打了拿 30pts。 正解用到了异或哈希。首先确定合法的数量即为总对数 \(\frac{n(n-1)}{2}\) 减…

java变量定义与数据类型

变量:在java程序运行过程中,其值可以发送改变的量 定义变量的语句格式: 数据类型 变量名 = 初始化值; 使用变量的注意事项: 1、使用基本数据类型的变量,实际上使用的是变量中存储的值 2、在同一作用域(同一个大括号)中,变量名不能重复 3、变量名是区分大小写的 4、java…

040、Vue3+TypeScript基础,使用nanoid库生成id

01、使用powershell,输入npm i nanoid来安装: 02、App.vue代码如下:<template><div class="app"><h2 class="title">App.Vue</h2><Page1/><br><Page2/></div> </template><script lang="…

2024.8.21 鲜花

太水了,但还是有重点的Never Gonna Give You Up Were no strangers to love You know the rules and so do I A full commitments what Im thinking of You wouldnt get this from any other guy I just wanna tell you how Im feeling Gotta make you understand Never gonna…