[算法]插入排序

news2025/7/20 12:58:45

参考:《漫画算法-小灰的算法之旅》

目录

1、排序算法的思想

2、具体步骤

3、插入排序的优化

4、时间复杂度和空间复杂度

5、代码


1、排序算法的思想

维护一个有序区,把元素一个个插入有序区的适当位置,直到所有元素都有序为止。

2、具体步骤

给定无序数组:

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

 第一轮:让元素8和有序区的元素依次比较。8>5,所以元素8和元素5无需交换,此时有序区的元素增加到两个:

⭐注意,比较是从有序序列的末尾开始的,也就是想要插入的元素和有序区的最大者开始比起,如果比他大,直接插入在其后面,否则依次向前比较,直到找到该插入的位置。如果一个元素和插入元素相同,就把要插入的元素放在与其相等的元素后面。(——>插入排序是稳定的)

第二轮:

让元素6和有序区的元素依次比较。 6<8,所以把元素6和元素8进行交换;6>5,所以元素6和元素5无须交换。 此时有序区的元素增加到3个:

第三轮: 

让元素3和有序区的元素依次比较。 3<8,所以把元素3和元素8进行交换;3<6,所以把元素3和元素6进行交换;3<5,所以把元素3和元素5进行交换;此时有序区的元素增加到4个:

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

3、插入排序的优化

当我们把每一个新元素插到有序区的时候,并不需要老老实实进行元素的两两交换。

上面例子的第三轮中,我们需要让元素3逐个与有序区的元素进行比较和 交换,与8交换、与6交换、与5交换,最终交换到有序区的第一个位置。但是我们并不需要真的进行完整交换,只需把元素3暂存起来,再 把有序区的元素从前向后逐一复制。

4、时间复杂度和空间复杂度

插入排序要进行n-1轮,每一轮在最坏情况下的比较次数分别是1 次、2次、3次、4次……一直到n-1次,所以最坏时间复杂度是O(n^2)。

由于插入排序是原地排序,并没有借助额外的存 储空间,所以空间复杂度是O(1).

5、代码

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多线程面试题

1. Sychronized的锁升级过程是怎样的&#xff1f; 2. Tomcat 中为什么要使用自定义类加载器&#xff1f; 3. 说说对线程安全的理解 4. 对守护线程的理解 5. 并发、并行、串行之间的区别 6. Java死锁如何避免&#xff1f; 7. 谈谈你对AQS的理解&#xff0c;AQS如何实现可重入锁&…

华为机试题:HJ107 求解立方根(python)

文章目录&#xff08;1&#xff09;题目描述&#xff08;2&#xff09;Python3实现&#xff08;3&#xff09;知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方…

2023年品牌惊蛰节气海报赏析

今天是3月6日——惊蛰&#xff0c;春日渐暖&#xff0c;春雷乍起&#xff0c;北方大地正在迎来新生&#xff0c;小鸟在枝头欢叫、种子在努力发芽&#xff0c;各大品牌也赶早发布了最新的惊蛰节气海报。下面就来和我们一起看看吧。 1&#xff0c;中国日报 2&#xff0c;BDuck…

java日志

日志是软件开发的重要组成部分。一个精心编写的日志代码提供快速的调试&#xff0c;维护方便&#xff0c;以及应用程序的运行时信息结构化存储。日志记录确实也有它的缺点。它可以减缓的应用程序Log4jLog4j是Apache的一个开放源代码项目&#xff0c;通过使用Log4j&#xff0c;我…

Spring | 基础

1. IOC和DI IOC&#xff1a;控制反转&#xff0c;其思想是反转资源获取的方向&#xff0c;传统的资源查找方式要求组件向容器发起请求查找资源&#xff0c;作为回应&#xff0c;容器适时的返回资源。而应用了 IOC 之后&#xff0c;则是**容器主动地将资源推送给它所管理的组件…

Sectigo中间证书根证书说明

Sectigo SSL证书产品证书链主要分为两个版本&#xff0c;常见的的一种版本多&#xff0c;但随着安全性提升&#xff0c;证书链的加载方式变化&#xff0c;第二种版本证书链更具备安全需要&#xff0c;对此做了详细说明。一、兼容性最高版本&#xff0c;根证书算法&#xff1a;s…

BI 是如何数据分析的?

企业部署商业智能BI前&#xff0c;需要进行详细的分析&#xff0c;了解BI能为企业带来多少价值&#xff1f;如何提高工作效率的等等&#xff0c;今天我们就来聊一聊 BI 的工作原理。 一、BI的取数方式 商业智能BI是通过访问和连接业务系统数据源数据库的方式来进行取数的&…

记录gitlab和jenkins集成的过程

gitlab设置外发请求 首先在前面的几篇文章中&#xff0c;我们的gitlab和jenkins都安装好了&#xff0c;在这里我们就可以对gitlab 和jenkins进行集成操作处理。 首先设置gitlab的外发请求,如图所示: 先点击管理员&#xff0c;进入到管理中心后 先点击设置&#xff0c;然后点击…

劲霸男装:400+门店的销售佣金管理,如何实现一键发薪

陪伴一代人记忆的劲霸男装&#xff08;下文简称「劲霸」&#xff09;&#xff0c;很多人应该都不陌生。 他们的门店遍布全国的大型商场及街边店铺&#xff0c;自1980起&#xff0c;发展已40余年&#xff0c;现拥有形象统一、规范管理的品牌专卖店2000多家。他们门店多&#xff…

传输层协议——UDP协议

❣️关注专栏&#xff1a;JavaEE 传输层虽然是操纵系统内核已经实现好了的&#xff0c;但是我们程序猿写代码要调用系统提供的 socket API 完成网络编程&#xff0c;其中 socket 就属于传输层部分。 &#x1f331; UDP协议 &#x1f331; 1 UDP协议端格式 上图就是UDP协议报…

Java面向对象特征之三:多态

一&#xff1a;面向对象三大特征之三&#xff1a;多态 1.多态是什么&#xff1f; 同类型的对象&#xff0c;执行同一个行为&#xff0c;会表现出不同的行为特征。 比如&#xff1a;猫和狗都是动物类型&#xff0c;执行同一个行为&#xff0c;但是会表现出不同的行为特征&…

flink sql 源码走读 --- 解释flink jdbc where 条件为什么没有下推数据库

本文通过一个具体案例&#xff0c;说明 flink sql 如何实现 connector 加载、source/sink 端操作、数据库连接等。可以帮助大家了解其原理&#xff0c;并在代码中找到落库执行SQL生成逻辑&#xff0c;得到where条件并没有下推到库执行的结论。 案例如下&#xff1a; create t…

Zookeeper集群和Hadoop集群安装(保姆级教程)

1. HA HA&#xff08;Heigh Available&#xff09;高可用 解决单点故障&#xff0c;保证企业服务 7*24 小时不宕机单点故障&#xff1a;某个节点宕机导致整个集群的宕机 Hadoop 的 HA NameNode 存在单点故障的可能&#xff0c;需要配置 HA 解决引入第二个 NameNode 作为备份同…

C语言学习(三)

#include <stdio.h> int main(void){int a; scanf("%d",&a); printf("%d",a); return 0&#xff1b;} 正在上传…重新上传取消正在上传…重新上传取消&符号作用是把键盘中输入的值给变量a,使用scanf()时输入数值&#xff0c;需要按一下enter…

MySQL知识点全面总结2:Mysql语句的执行(DDL DML 完整性约束)

二.MySQL知识点全面总结2&#xff1a;mysql语句的执行&#xff08;DDL DML 完整性约束&#xff09; 1.对数据库的操作&#xff08;DDL&#xff09; 2.对数据表的操作&#xff08;DDL&#xff09; 3.对数据表字段的操作&#xff08;DDL&#xff09; 4.对数据表内容的增删改&…

Science Direct 高级检索、使用技巧、寻找目标期刊、E lsevi er 投稿指南

ScienceDirect使用教程&E ls evier投稿指南1. 高级检索功能1.1 布尔值运算符和短语搜索&#xff08;构建检索式&#xff09;1.2 搜索特殊字符和公式1.3 非搜索用词2. 如何使用搜索结果页面&#xff1f;3. 下载多个文档3.1 从搜索结果列表中下载多个文档3. 利用 JournalFind…

java高性能并发计数器之巅峰对决

并发计数器各个方案介绍方案概述1. jdk5提供的原子更新长整型类 AtomicLong2. synchronized3. jdk8提供的 LongAdder 【单机推荐】4. Redisson分布式累加器【分布式推荐】方案介绍jdk5提供的原子更新长整型类 AtomicLong在JDK1.5开始就新增了并发的Integer/Long的操作工具类Ato…

VS2022+qt5.14.2配置qcustomplot2.1.16(坑很多)

目录1. 前言2. 下载QCustomPlot的源码3. 将QCustomPlot添加到QT项目&#xff08;一些遇到的问题&#xff09;1. 前言 QCustomPlot 是一个超强超小巧的qt绘图类&#xff0c;非常漂亮&#xff0c;非常易用&#xff0c;只需要加入一个qcustomplot.h和qcustomplot.cpp文件即可使用…

Android 基础知识4-3.7 ProgressBar(进度条)详解

一、简介 ProgressBar&#xff08;进度条&#xff09;是UI界面中一种非常实用的组件&#xff0c;通常用于向用户像是某个耗时操作完成的百分比。进度条可动态地显示进度&#xff0c;因此避免长时间地执行某个操作时&#xff0c;让用户感觉程序失去了响应&#xff0c;从而更好地…

常用反弹 shell 方式总结

在对 Linux 系统进行渗透测试中&#xff0c;常常会用到反弹 shell 的操作&#xff0c;今天来总结一下常用反弹 shell 的方式。 什么是反弹shell&#xff1a; 反弹shell&#xff0c;就是攻击机监听在某个TCP/UDP端口为服务端&#xff0c;目标机主动发起请求到攻击机监听的端口…