【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)

目录

一、插入排序 算法思想

二、插入排序 算法步骤 

四、复杂度分析

时间复杂度:O(n^2)

空间复杂度:O(1) 

稳定性:稳定算法 

五、应用场景 


💓 博客主页:C-SDN花园GGbond

⏩ 文章专栏:探索数据结构与算法

一、插入排序 算法思想

**插入排序(Insert Sort)**是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。它的思想类似于我们打扑克牌时的整理 

二、插入排序 算法步骤 

  1. 将第一待排序 序列的第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
  2. 从尾到头依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)     
  3. 具体步骤是这样的:
    (以排升序为例)

    从第一个元素开始,该元素可以认为已经被排序。
    取出下一个元素,在已经排序的元素序列中从后向前扫描。
    如果该元素(已排序)大于新元素,将该元素向后移动一位。
    重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。
    将新元素插入到该位置后。
    重复步骤2~5,直到所有元素都排序完成。

动图 

三、C语言代码实现 

//插入排序
void InsertSort(int* a, int len)
{//0到end有序,插入a[end+1]for (int i = 0; i < len - 1; i++){int end = i;int tmp = a[i + 1];while (end >= 0){if (a[end]>tmp){a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}

四、复杂度分析

时间复杂度:O(n^2)

最好情况(O(n)):

当输入数组已经是排序状态时,插入排序的性能最优。此时,每个元素只需与其前面的一个元素进行比较(因为它已经位于正确的位置),因此总共需要进行大约n-1次比较,时间复杂度为O(n)。这里的n是数组的长度。

最坏情况(O(n^2)):

当输入数组完全逆序时,插入排序的性能最差。对于每个元素,都需要与其前面的所有元素进行比较,直到找到合适的位置。因此,第i个元素需要比较i次(其中i从2开始,直到n),总共需要进行的比较次数大约为1 + 2 + 3 + ... + (n-1) = n(n-1)/2,时间复杂度为O(n^2)。

平均情况(O(n^2)):

对于随机排列的数组,插入排序的平均时间复杂度也是O(n^2)。这是因为大部分情况下,元素都需要进行多次移动和比较才能找到正确的位置。

空间复杂度:O(1) 

插入排序是一种原地排序算法,它只需要一个额外的存储空间来暂存当前需要插入的元素(即“key”),而不需要额外的数组来存储排序过程中的数据。因此,其空间复杂度为O(1)。

稳定性:稳定算法 

 插入排序是一种稳定的排序算法。在插入排序过程中,如果两个相等的元素,后面的元素不会移动到前面元素的前面,而是直接插入到与它相等的元素之后,从而保持了原有的相对顺序。

五、应用场景 

插入排序虽然在大规模数据集上可能不是最高效的排序算法,但其简单性、稳定性和在某些特定场景下的高效性使得它在许多实际应用中仍然具有一定的价值。

小规模数据集:由于插入排序在小规模数据集上表现良好,且实现简单,因此常用于对少量数据进行排序的场景。快速排序的小区间优化
几乎有序的数据集:当数据已经接近有序时,插入排序的性能会显著提高。因为此时大部分元素已经处于或接近其最终位置,所需的比较和移动次数会大幅减少。
链表排序:由于链表不支持像数组那样的随机访问,因此在链表上进行排序时,插入排序成为了一个非常合适的选择。它可以通过改变节点的指针来实现元素的移动,而不需要额外的存储空间。

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

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

相关文章

uni-app 应用名称 跟随系统语言 改变

官方已确认BUG:&#xff1a;https://ask.dcloud.net.cn/question/164804 { "name" : "%app.name%",//这里随便写&#xff0c;配置了 locales,name 就不生效了 "appid" : "", "description" : "", "versi…

git命令行基础常用指令

git命令行基础常用指令 git status git status //用来查询当前仓库的状态&#xff0c;包括位于哪个分支、工作区有哪些文件被修改以及哪些文件被添加、暂存区有哪些文件暂存。git diff 用来查看当前工作区的文件的修改内容 git diff //修改内容不会全部显示&#xff0c;…

【JAVA开源】基于Vue和SpringBoot的购物商城网站

本文项目编号 T 032 &#xff0c;文末自助获取源码 \color{red}{T032&#xff0c;文末自助获取源码} T032&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【Java面试】第九天

&#x1f31f;个人主页&#xff1a;时间会证明一切. 目录 Spring中如何开启事务&#xff1f;编程式事务声明式事务声明式事务的优点声明式事务的粒度问题声明式事务用不对容易失效 Spring的事务传播机制有哪些&#xff1f;Spring事务失效可能是哪些原因&#xff1f;代理失效的情…

红黑树的插入(NGINX源码)

下载并查看NGINX源码 访问NGINX下载页面&#xff0c;找到所需版本 https://nginx.org/en/download.html 使用wget下载源码包&#xff0c;替换版本号为所需版本 wget http://nginx.org/download/nginx-1.24.0.tar.gz解压源码包 tar -xzvf nginx-1.24.0.tar.gz进入解压后的目…

用nginx-rtmp-win32-master及ffmpeg模拟rtmp视频流

效果 使用nginx-rtmp-win32-master搭建RTMP服务 双击exe就可以了。切记整个目录不能有中文 README.md ,启用后本地的RTM路径: rtmp://192.168.1.186/live/xxx ffmpeg将地本地视频推RMTP F:\rtsp\ffmpeg-7.0.2-essentials_build\bin>ffmpeg -re -i F:\rtsp\123.mp4 -c c…

苹果为什么不做折叠屏手机?

苹果为什么不做折叠屏手机&#xff1f;折叠屏手机在最近这些年里边&#xff0c;可以说是市场的一个主要在手机上的增长点。你像华W最近推出这个三折叠手机&#xff0c;引起了整个市场的轰动。 可是&#xff0c;为什么苹果到今天为止不为所动&#xff0c;还在那不停地在现在的这…

ARM64基础 -- x29 和 x30 寄存器详解

ARM64 架构中的 x29 和 x30 寄存器详解 在 ARM64 架构中&#xff0c;x29 和 x30 是两个通用寄存器&#xff0c;但它们有特殊的惯例用途&#xff0c;特别是在函数调用和栈帧管理中。以下是对这两个寄存器的详细讲解。 1. x29 寄存器 别名&#xff1a;FP&#xff08;Frame Poi…

【PyTorch】深入浅出PyTorch

为什么要学习PyTorch Why learn PyTorch PyTorch日益增长的发展速度与深度学习时代的迫切需求 PyTorch实验模型训练 数据 模型 损失函数 优化器 迭代训练 模型应用 如何学习和掌握PyTorch 勤动手 成体系 构建知识体系 熟悉知识分布 对应查缺补漏 多总结

Leetcode Hot 100刷题记录 -Day14(矩阵置0)

矩阵置0 问题描述&#xff1a; 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a;…

在 Spring Boot 中使用 Spring Security + JWT + MySQL 实现基于 Token 的身份认证

文章目录 在 Spring Boot 中使用 Spring Security JWT MySQL 实现基于 Token 的身份认证一、引言二、环境搭建1、第一步&#xff1a;引入依赖2、第二步&#xff1a;配置MySQL数据库 三、实现身份认证三、实现身份认证1、定义实体和数据访问层1.1、实体类定义1.2、数据访问层 …

华为OD机试 - 端口合并(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

Web后端服务平台解析漏洞与修复、文件包含漏洞详解

免责申明 本文仅是用于学习检测自己搭建的Web后端服务平台解析漏洞、文件包含漏洞的相关原理,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在国…

mysql怎样优化count(*) from 表名 where …… or ……这种慢sql

一 问题描述 线上发现一条类似这样的慢sql&#xff08;查询时长8s&#xff09;&#xff1a; select id,name,(select count(*) from t14 where t14.idt15.id or t14.id2t15.id) as cnt from t15 ; t14的id和id2字段上都有索引&#xff0c;但是因为条件里有or&#xff0c;导致…

电路设计学习(一)

FUSB302BUCX 可编程 USB Type-C 控制器&#xff0c;带 PD&#xff08;默认 SNK&#xff09; FUSB302BUCX 是一款由 ON Semiconductor 生产的 USB Type-C 控制器&#xff0c;用于实现 USB Type-C 和 USB Power Delivery (PD) 协议。它主要负责 USB Type-C 端口的检测、CC 引脚…

GESP C++二级样题卷

一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 1.目前主流的计算机储存数据最终都是转换成&#xff08; &#xff09;数据进行储存。 ​ A&#xff0e;二进制 ​ B&#xff0e;十进制 ​ C&#xff0e; 八进制 ​ D&#xff0e;十六进制 2.已知大写字…

结构开发笔记(八):solidworks软件(七):装配图中让摄像头绕轴旋转起来

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/142176639 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

量化交易backtrader实践(二)_基础加强篇(3)_策略类实践进阶

通过前面几节的实践&#xff0c;我们已经对股票数据的获取&#xff0c;pandasData数据的格式处理&#xff0c;到bactrader的DATAS结构以及里面的data的数据结构&#xff0c;以及在init和next函数中如何读取和计算都有了比较清晰的认知。我们通过一个最简的回测系统&#xff0c;…

Java 读取特定目录下子文件夹的 json格式文件并解析

一、需求   有一个目录结构&#xff0c;包含多个子文件夹&#xff0c;每个子文件夹中都有一个名为goods.txt的文件&#xff0c;文件内容以 JSON 格式存储。现在需要将所有的goods.txt文件内容读取出来&#xff0c;放在一个List集合中&#xff0c;以便进行后续的处理。 二、使…

Pre-training、Post-training、Continue training的区别

在训练大语言模型时&#xff0c;大家可能会搞混以下几个概念&#xff0c;下面做一个详细的对比区分&#xff1a; 概念Pre-training&#xff08;预训练&#xff09;Post-training&#xff08;后训练&#xff09;Continue Training&#xff08;持续训练&#xff09;定义预训练是…