当前位置: 首页 > news >正文

【数据结构】直接插入排序

目录

一、基本思想

二、动图演示

三、思路分析

四、代码实现

五、易错提醒

六、时间复杂度分析


一、基本思想

直接插入排序(Straight Insertion Sort)是一种简单直观的排序算法,其基本思想是:

把待排序的一个记录按其关键码值的大小,从后往前扫描,插入到一个已经排好的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。

生活中我们玩扑克牌以及整理书籍的时候都用到了直接插入排序算法的思想。

二、动图演示

三、思路分析

这里以升序为例:

  1. 首先要从无序表中取出第一个元素a,确定a的位置序号,跟有序表中最后一个元素进行比较
  2. 若发现a小于有序表的最后一个元素,则将有序表的最后一个元素放在元素a的位置(这里要先将a用临时变量tmp存放起来,防止被覆盖)
  3. 然后再让tmp与有序表倒数第二个元素进行比较,以此类推......
  4. 当a不小于有序表中的某个元素时,则将a放在该元素的下一个位置即可
  5. 这样就完成了单趟的排序,下一个无序表中的元素重复相同步骤

结合图分析,如下所示:

四、代码实现

下面是升序代码的实现

//n为数据元素个数
void InsertSort(int*a,int n)
{for (int i=0;i<n-1;i++)//这里i不能从1开始{//单趟排序//[0,end]的值有序,end+1处的值插入[0,end],仍保持有序int end = i;int tmp = a[end+1];while (end>=0){if (tmp < a[end]) //注意这里的tmp不能换成a[end+1],因为之前的a[end+1]会被覆盖{a[end + 1] = a[end];end--;}else{break;}}a[end + 1] = tmp;}
}

五、易错提醒

为什么要将a[end+1]=tmp写在while循环外面呢?而不是写在else语句里呢?

分析如下:

因为这里会出现两种情况

情况1:当待排的数字不比有序序列的第一个元素小的时候,那就可以将a[end+1]=tmp;写在else语句里

情况2:当待排的数字有序序列的第一个元素小的时候,也就是如下图情况:

经过上图分析可知,我们其实可以将代码写成如下形式:

void InsertSort(int* a, int n)
{for (int i = 0; i < n - 1; i++){int end = i;int tmp = a[end + 1];while (end >= 0){if (tmp < a[end]) {a[end + 1] = a[end];end--;}else{a[end + 1] = tmp;break;}}if (end == -1){a[end + 1] = tmp;}}
}

 该代码是把情况1和情况2分开来写,这种写法更易于理解

而将a[end+1]=tmp写在while循环外面是把两种情况写在了一起,使得代码更加简洁高效。

六、时间复杂度分析

最好情况下的时间复杂度是:O(N)

最坏情况下的时间复杂度是:O(N^2)

分析过程如下图所示:

相关文章:

【数据结构】直接插入排序

目录 一、基本思想 二、动图演示 三、思路分析 四、代码实现 五、易错提醒 六、时间复杂度分析 一、基本思想 直接插入排序&#xff08;Straight Insertion Sort&#xff09;是一种简单直观的排序算法&#xff0c;其基本思想是&#xff1a; 把待排序的一个记录按其关键码…...

JavaScript 实现虚拟滚动技术

虚拟滚动 虚拟滚动&#xff08;有时称为 虚拟列表、虚拟滚动条&#xff09;是 JavaScript 中的一种技术&#xff0c;旨在优化大数据量的列表渲染&#xff0c;尤其是当有成千上万的数据项时&#xff0c;直接渲染整个列表会导致性能问题。虚拟列表通过只渲染用户视口中可见的那一…...

【重学 MySQL】十八、逻辑运算符的使用

【重学 MySQL】十八、逻辑运算符的使用 AND运算符OR运算符NOT运算符异或运算符使用 XOR 关键字使用 BIT_XOR() 函数注意事项 注意事项 在MySQL中&#xff0c;逻辑运算符是构建复杂查询语句的重要工具&#xff0c;它们用于处理布尔类型的数据&#xff0c;进行逻辑判断和组合条件…...

关于 QImage原始数据格式与cv::Mat原始数据进行手码数据转换 的解决方法

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

前端WebSocket客户端实现

// 创建WebSocket连接 var socket new WebSocket(ws://your-spring-boot-server-url/websocket-endpoint);// 连接打开时触发 socket.addEventListener(open, function (event) {socket.send(JSON.stringify({type: JOIN, room: general})); });// 监听从服务器来的消息 socke…...

读取realsense d455双目及imu

问题定义 实时读取realsense数据喂给slam系统 代码 /** rs_d455设备 */#include <librealsense2/rs.hpp> #include <iostream>#include "rs_common_device.h"// opencv #include <opencv2/opencv.hpp>class RsD455Device: public rsCmmonDevice…...

浮点的运算

浮点数表示&#xff1a; N 尾数 * 基数指数 1.25 X 106 尾数一般用补码&#xff0c;指数一般用移码 在IEEE745中尾数可以是原码。 尾数可以表示数值的有效精度&#xff0c;位数越多精度越高 阶码的位数决定数的表示范围&#xff0c;位数越多&#xff0c;范围越大 对阶时&…...

对随机游走问题的分析特定行为模式的建模

从一段随机游走的数据中寻找特定的行为模式&#xff0c;这种问题涉及 序列模式识别 或 序列分析。处理这种问题的算法选择取决于你要找的模式的具体性质和复杂性。以下是几种可能的算法&#xff1a; 隐马尔可夫模型&#xff08;HMM&#xff09; 隐马尔可夫模型特别适合处理随…...

JVM面试(七)G1垃圾收集器剖析

概述 上一章我们说了&#xff0c;G1收集器&#xff0c;它属于里程碑式的发展&#xff0c;开创了面向局部收集垃圾的概念。专门针对多核处理器以及大内存的机器。在JDK9中&#xff0c;更是呗指定为官方的GC收集器。满足高吞吐的通知满足GC的STW停顿时间尽可能的短。 虽然现在我…...

php转职golang第一期

入局golang 基础语法&#xff1a;学习 Go 语言的基本语法、数据类型、流程控制等。 数据结构与算法&#xff1a;掌握常用的数据结构和算法。 Web 开发基础&#xff1a;了解 HTTP 协议、Web 开发的基本概念。 Gin 框架或其他 Web 框架&#xff1a;深入学习使用一种 Go 的 Web…...

java后端服务监控与告警:Prometheus与Grafana集成

Java后端服务监控与告警&#xff1a;Prometheus与Grafana集成 大家好&#xff0c;我是微赚淘客返利系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在现代的微服务架构中&#xff0c;监控和告警是确保服务稳定性的关键组成部分。Pr…...

【系统架构设计师】工厂方法设计模式

工厂方法(Factory Method)模式是一种创建型设计模式,它定义了一个用于创建对象的接口,但让子类决定要实例化的类是哪一个。工厂方法让类的实例化延迟到子类中进行。 工厂方法模式的主要角色 产品(Product):定义工厂的创建对象的接口。具体产品(Concrete Product):实…...

怎样解决OpenEuler下载sdl2失败

OpenEuler 下载 sdl2失败 解决办法(使用wget中git上下载) wget https://github.com/libsdl-org/SDL/releases/download/release-2.30.6/SDL2-2.30.6.tar.gz使用yum下载&#xff0c;下载的最后说找不到这样的库(no match)使用 apt-get&#xff0c;说找不到apt-get使用curl冲gi…...

基于Python的自然语言处理系列(2):Word2Vec(负采样)

在本系列的第二篇文章中&#xff0c;我们将继续探讨Word2Vec模型&#xff0c;这次重点介绍负采样&#xff08;Negative Sampling&#xff09;技术。负采样是一种优化Skip-gram模型训练效率的技术&#xff0c;它能在大规模语料库中显著减少计算复杂度。接下来&#xff0c;我们将…...

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c;常言道&#xff0c;不积跬步无以至千里&#xff0c;希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目&#xff1a; 牛牛发明了一种新的四舍五…...

大数据之Flink(六)

17、Flink CEP 17.1、概念 17.1.1、CEP CEP是“复杂事件处理&#xff08;Complex Event Processing&#xff09;”的缩写&#xff1b;而 Flink CEP&#xff0c;就是 Flink 实现的一个用于复杂事件处理的库&#xff08;library&#xff09;。 总结起来&#xff0c;复杂事件处…...

设计模式学习[5]---装饰模式

文章目录 前言1. 原理阐述2. 举例2.1 人装饰方案一2.2 人装饰方案二2.3 人装饰方案三 总结 前言 近期在给一个已有的功能拓展新功能时&#xff0c;基于原有的设计类图进行讨论。其中涉及到了装饰模式&#xff0c;因为书本很早已经看过一遍&#xff0c;所以谈及到这个名词的时候…...

3.C_数据结构_栈

概述 什么是栈&#xff1a; 栈又称堆栈&#xff0c;是限定在一段进行插入和删除操作的线性表。具有后进先出(LIFO)的特点。 相关名词&#xff1a; 栈顶&#xff1a;允许操作的一端栈底&#xff1a;不允许操作的一端空栈&#xff1a;没有元素的栈 栈的作用&#xff1a; 可…...

Debian11安装DolphinScheduler

安装地址 前置准备工作 JDK安装 下载JDK (1.8)&#xff0c;安装并配置 JAVA_HOME 环境变量&#xff0c;并将其下的 bin 目录追加到 PATH 环境变量中。如果你的环境中已存在&#xff0c;可以跳过这步 二进制包安装DolphinScheduler 依赖 apt-get install psmisc 二进制安…...

C语言深度剖析--不定期更新的第五弹

const关键字 来看一段代码&#xff1a; #include <stdio.h> int main() {int a 10;a 20;printf("%d\n", a);return 0; }运行结果如下&#xff1a; 接下来我们在上面的代码做小小的修改&#xff1a; #include <stdio.h> int main() {const int a 1…...

【前端无障碍】屏幕阅读器兼容性:确保视障用户的良好体验

【前端无障碍】屏幕阅读器兼容性&#xff1a;确保视障用户的良好体验 前言 大家好&#xff0c;我是cannonmonster01&#xff01;今天咱们来聊聊屏幕阅读器兼容性这个话题。想象一下&#xff0c;一个视障用户打开你的网站&#xff0c;通过屏幕阅读器来浏览内容。如果你的网站没有…...

蛋白质设计新范式:QUBO建模与迭代学习框架解析

1. 项目概述与核心思路在生物信息学和计算生物学领域&#xff0c;蛋白质设计一直是一个“圣杯”级别的挑战。简单来说&#xff0c;它要回答一个逆向问题&#xff1a;给定一个我们想要的蛋白质三维结构&#xff0c;如何从头设计出能折叠成这个结构的氨基酸序列&#xff1f;传统方…...

《彻底搞懂RAG技术:解决大模型幻觉,落地企业AI应用的核心方案》

随着大模型技术快速普及&#xff0c;众多企业纷纷入局AI落地&#xff0c;但绝大多数通用大模型在实际业务场景中都会面临两大致命难题&#xff1a;知识滞后与幻觉问题。通用大模型的训练数据存在固定时间截止点&#xff0c;无法获取最新行业数据、企业私有业务数据&#xff0c;…...

利用Taotoken实现多模型备选方案以提升业务连续性

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 利用Taotoken实现多模型备选方案以提升业务连续性 在中大型企业将AI能力集成到关键业务流程时&#xff0c;服务的连续性与稳定性是…...

专业级GPU内存检测:MemTestCL的5个实战场景深度解析

专业级GPU内存检测&#xff1a;MemTestCL的5个实战场景深度解析 【免费下载链接】memtestCL OpenCL memory tester for GPUs 项目地址: https://gitcode.com/gh_mirrors/me/memtestCL MemTestCL作为斯坦福大学开发的开源OpenCL内存检测工具&#xff0c;为GPU、CPU及各类…...

因果推断与双机器学习在LED制造返工决策中的实战应用

1. 项目概述&#xff1a;当因果推断遇上LED制造返工决策在LED制造车间里&#xff0c;每天都有成千上万个生产批次流过产线。每一个批次在经过荧光粉转换工序后&#xff0c;操作员都需要做一个关键决定&#xff1a;这个批次是否需要“返工”——也就是额外喷涂一层荧光粉来校正颜…...

为什么91%的DeepSeek部署在第7轮后开始“失忆”?揭秘KV Cache碎片率超阈值的实时熔断策略

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;DeepSeek多轮对话优化 DeepSeek系列大模型在多轮对话场景中面临上下文衰减、指代歧义与意图漂移等典型挑战。为提升长程一致性与角色连贯性&#xff0c;需从提示工程、状态管理与响应重校准三个维度协同优化。…...

一直怕大模型幻觉,发现针对性harness约束能大大消除

我让AI写长文&#xff0c;然后人工审核&#xff0c;发现大量胡编乱造。 如果人工一个个消除&#xff0c;实在太累了&#xff0c;这就不是LLM自动化办公的路子了 尝试了 harness (engineering)的实操路子&#xff0c; 试用发现&#xff1a; 大模型正在把长文中我人工审核发现的幻…...

DeepSeek企业私有化部署隐私加固手册(含密钥轮转SOP、审计日志留存策略、跨境传输断点协议)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek企业私有化部署隐私保护总览 DeepSeek大模型的企业私有化部署&#xff0c;以“数据不出域、模型可审计、推理可管控”为核心设计原则&#xff0c;构建端到端的隐私保护技术栈。该方案支持在客户自有I…...

Nodejs后端服务集成Taotoken多模型API的实践路径

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Nodejs后端服务集成Taotoken多模型API的实践路径 对于Node.js后端开发者而言&#xff0c;将大模型能力集成到现有应用中是常见的需…...