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

article/2025/9/17 6:19:16

目录

 一、概述

二、直接插入排序

1)概述

2)步骤

3)示意图

 4)分析:不带监视哨的算法

5)算法实现:不带监视哨

6)分析:带监视哨的算法

7)算法:带监视哨

8)性能分析


前言

1.插入排序,一般也被称为直接插入排序。对于少量元素的排序是一个好的排序方法。插入排序是一种最简单的排序方法。

2.它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 。


 一、概述

插入排序:每次将一个待排序的记录,按其关键字的大小插入到前面已排序好的记录序列中的适当位置,直到全部记录插入完成为止。

确定插入位置的查找方法不同导致不同的算法描述:

  • 直接插入排序:基于顺序查找

  • 希尔排序:基于逐趟缩小增量


二、直接插入排序

直接插入排序是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。

1)概述:

  • 直接插入排序:Straight Insertion Sort

  • 基本条件:待排序记录依次存放在数据r[0..n-1]中

  • 思想:

    1.先将第0个记录,组成一个有序子表

    2.然后依次将后面的记录插入到这个子表中,且一直保持它的有序性。

2)步骤

  1. 在r[0..i-1]中查找r[i]的插入位置,r[0..j].key ≤r[i].key < r[j+1..i-1].key

  2. 将r[j+1 .. i-1] 中的所有记录均后移一个位置

  3. 将r[i]插入到r[j+1]的位置上

3)示意图

 4)分析:不带监视哨的算法

  1. 查找r[i]的插入位置,将r[i]暂存在临时变量temp中,将temp与r[j] (j=i-1,i-2, ..., 0)依次进行比较

  2. temp.key < r[j].key,则将r[j]后移一个位置,直到temp.key ≥ r[j].key 为止

  3. 将temp插入到第j+1个位置上

  4. 令 i = 1, 2, 3, ..., n-1 ,重置上面3步。

5)算法实现:不带监视哨

  • 算法

//【算法1】 不带监视哨的直接插入排序算法
public void insertSort() {RecordNode temp;int i, j;for (i = 1; i < this.curlen; i++) {		// n-1趟扫描temp = r[i];  						// 将待插入的第i条记录暂存在temp中for (j = i - 1; j >= 0 && temp.key.compareTo(r[j].key) < 0; j--) { r[j + 1] = r[j];				// 将前面比r[i]大的记录向后移动}r[j + 1] = temp;          			// r[i]插入到第j+1个位置//System.out.print("第" + i + "趟: ");//display();}
}
  • 测试

public class TestSeqList1_insert {public static void main(String[] args) throws Exception {int[] arr = {52,39,67,95,79,8,25,52};SeqList seqList = new SeqList(arr.length);for (int i = 0; i < arr.length; i++) {seqList.insert(i, new RecordNode(arr[i]));}// 不带监视哨的直接插入排序seqList.insertSort();}
}
//
//第1趟:  39 52 67 95 79  8 25 52
//第2趟:  39 52 67 95 79  8 25 52
//第3趟:  39 52 67 95 79  8 25 52
//第4趟:  39 52 67 79 95  8 25 52
//第5趟:   8 39 52 67 79 95 25 52
//第6趟:   8 25 39 52 67 79 95 52
//第7趟:   8 25 39 52 52 67 79 95

6)分析:带监视哨的算法

以上不带监视哨的算法中的【算法1】第6行的循环条件中的j≥0用来控制下标越界。为了提高算法效率,可对该算法改进如下:

  • 首先将待排序的n条记录从下标为1的存储单元开始依次存放在数组r中,

  • 在将顺序表的第0个存储单元设置为一个监视哨,即在查找之前把r[i]赋给r[0],

  • 这样每循环一次,只需要进行记录的比较,不需要比较下标是否越界

7)算法:带监视哨

  • 算法

//【算法2】带监视哨的直接插入排序算法
public void insertSortWithGuard() {int i, j;
//        System.out.println("带监视哨的直接插入排序");for (i = 1; i <this.curlen; i++) {      //n-1趟扫描r[0] = r[i]; //将待插入的第i条记录暂存在r[0]中,同时r[0]为监视哨for (j = i - 1; r[0].key.compareTo(r[j].key) < 0; j--) { //将前面较大元素向后移动r[j + 1] = r[j];}r[j + 1] = r[0];          // r[i]插入到第j+1个位置System.out.print("第" + i + "趟: ");display(9);}
}
  • 测试

/*** @author 桐叔* @email liangtong@itcast.cn*/
public class TestSeqList2_insertGuard {public static void main(String[] args) throws Exception {int[] arr = {0,52,39,67,95,79,8,25,52};SeqList seqList = new SeqList(arr.length);for (int i = 0; i < arr.length; i++) {seqList.insert(i, new RecordNode(arr[i]));}// 带监视哨的直接插入排序seqList.insertSortWithGuard();}
}
//
//第1趟:  39 52 67 95 79 8 25 52
//第2趟:  39 52 67 95 79 8 25 52
//第3趟:  39 52 67 95 79 8 25 52
//第4趟:  39 52 67 79 95 8 25 52
//第5趟:  8 39 52 67 79 95 25 52
//第6趟:  8 25 39 52 67 79 95 52
//第7趟:  8 25 39 52 52 67 79 95

8)性能分析

  • 平均值:约n2/4,直接插入排序的时间复杂度为O(n2)

  • 需要一个辅助单元r[0],空间复杂度为O(1)

  • 直接插入排序是一种稳定的排序算法。


写到最后

四季轮换,已经数不清凋零了多少, 愿我们往后能向心而行,一路招摇胜!

🐋 你的支持认可是我创作的动力

💟 创作不易,不妨点赞💚评论❤️收藏💙一下

😘 感谢大佬们的支持,欢迎各位前来不吝赐教


http://chatgpt.dhexx.cn/article/D0iQayPE.shtml

相关文章

插入排序图解

七大排序之插入排序 文章目录 七大排序之插入排序前言一、直接插入排序1.1 算法图解1.2 算法稳定性1.3 插入排序和选择排序相比到底优在哪&#xff1f; 二、折半插入排序总结 前言 博主个人社区&#xff1a;开发与算法学习社区 博主个人主页&#xff1a;Killing Vibe的博客 欢迎…

Mysql中4种常见的插入方式

4种常见insert方式 准备工作 CREATE TABLE identity_table (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键id,identity_id int(11) DEFAULT NULL COMMENT 身份Id,name varchar(255) DEFAULT NULL COMMENT 姓名,PRIMARY KEY (id),UNIQUE KEY identity_idx (identity_id) C…

老生常谈:接口幂等性,防止并发插入重复数据

分布式系统中&#xff0c;接口幂等性问题&#xff0c;对于开发人员来说&#xff0c;是一个跟语言无关的公共问题。不知道你有没有遇到过这些场景&#xff1a; 有时我们在填写某些form表单时&#xff0c;保存按钮不小心快速点了两次&#xff0c;表中竟然产生了两条重复的数据&a…

c++常见面试问题总结

c和C语言的区别 C语言是面向结构性语言&#xff0c;C是面向对象语言 c语言是c的子集&#xff0c;c包含了c语言的全部词法和语法内容&#xff0c;比c语言多出了类。 程序运行的保存的五个区 堆 栈 常量 全局变量 代码区 什么是面向对象&#xff1a;注重的是对象&#xff0c;当…

SQL语句

DDL 1.DDL 库 定义库&#xff1a;创建数据库 create database 数据库名; (数据库名要求&#xff1a;区分大小写&#xff0c;唯一性 &#xff0c;不能使用关键字如create select;不能单独使用 的数字和特殊符号) 查看所有数据库&#xff1a;show databases&#xff1b; 选择/进入…

矿山尾矿库倾斜摄影三维建模

尾矿库现状调查是矿山安全生产工作的重要组成部分&#xff0c;也是监管部门关注的焦点。及时对尾矿库的现状进行调查&#xff0c;对存在的问题提出合理的整治方案&#xff0c;是控制尾矿库发生灾害的有效手段之一。本文以中维空间应用无人机倾斜摄影技术和三维激光扫描技术在某…

浙江数字孪生数字化工厂三维激光扫描建模_三维可视化管理平台_吉优赛维_三维建模解决方案_3D模型

作为工业4.0的标志之一&#xff0c;数字化工厂的建设趋势已经不可逆转了&#xff0c;而且很多企业也纷纷加入了这一行列当中。既要打造符合自己行业特色的数字化工厂&#xff0c;而且也要建造起符合自己未来盈利要求的工厂&#xff0c;于是在这种情况下三维扫描真正发挥了它的作…

那些与三维激光扫描有关的建模

文章目录 一、前言 二、正文 建模的方式 正向设计建模 参照点云数据逆向建模 粗略参照式逆向建模 精细参照式逆向建模 基于点云数据直接建模 基于照片建模 建模的目的 提升视觉及感观效果 附加属性信息 适用于承载平台 数据轻量化存储 打印输出 远离建模误区 见…

[数学建模]学习笔记1:初等建模

初等模型&#xff1a; 1.研究对象的机理比较简单 2.用静态&#xff0c;线性&#xff0c;确定性模型即可达到建模的目的 3.可以利用初等数学方法来构造和求解模型 注&#xff1a;尽量用简单的数学工具来建模 2.1 光盘的数据容量 调查和分析 经过编码的数字信息&#xff0c;以…

【三维激光扫描】第五章:基于点云数据的立面图绘制及三维建模

本文讲述CAD中加载点云并绘制立面图,然后在Sketchup中构建三维模型。 目 录 第一节 CAD绘制立面图 第二节 Sketchup三维模型构建

激光SLAM流程

1.激光数据处理&#xff08;非常重要&#xff01;&#xff01;&#xff01;&#xff09; 激光运动畸变&#xff1b; 激光去运动畸变详解 轮式里程计的标定&#xff1b; 标定参数&#xff1a;轮子半径&#xff0c;两轮间距&#xff1b; 为什么标定&#xff1a;虽然出厂会给出参…

3D目标检测跟踪:激光雷达+视觉的目标级融合

论文:Visual-LiDAR based 3D Object Detection andTracking for Embedded Systems-IEEE Access 内容主要方法激光雷达地面滤波聚类Bounding box拟合跟踪 视觉雷达和视觉融合 总结 论文中激光检测方法是在原工作基础上改进的&#xff0c;可阅读论文Dynamic Multi-LiDAR Based Mu…

AMCL 激光测量模型

一、似然域模型 likelihood_field model 1、原理 它是一种“特设(ad hoc)”算法&#xff0c;不必计算相对于任何有意义的传感器物理生成模型的条件概率。而且&#xff0c;这种方法在实践中运行效果良好。即使在混乱的空间&#xff0c;得到的后验也更光滑&#xff0c;同时计算更…

Ansys Zemax | 使用OpticStudio进行闪光激光雷达系统建模(下)

在消费类电子产品领域&#xff0c;工程师可利用激光雷达实现众多功能&#xff0c;如面部识别和3D映射等。尽管激光雷达系统的应用非常广泛而且截然不同&#xff0c;而“闪存激光雷达”解决方案适用于在使用固态光学元件的目标场景中生成可检测的点阵列。 凭借在针对小型封装获…

相机+激光雷达重绘3D场景

将激光雷达与相机结合&#xff0c;再通过深度学习的方式获得场景的3D模型——Ouster首席执行官在博客中介绍了相机OS-1&#xff0c;并装有激光雷达。LiveVideoStack对原文进行了摘译。 文 / Angus Pacala. Ouster 译 / 王月美 技术审校 / 田栋 原文 https://medium.com/ouster…

2020年亚太杯数学建模竞赛赛题

https://download.csdn.net/download/Suger_Lover/46133529https://download.csdn.net/download/Suger_Lover/46133529https://download.csdn.net/download/Suger_Lover/46133529

PSpice仿真之建模-以半导体激光器为例

PSpice仿真之建模 第一篇原创博客&#xff0c;来点干货~最近应同学之托&#xff0c;解决一个PSpice建模问题&#xff0c;在解决过程中遇到很多问题&#xff0c;于是想写下来&#xff0c;后来者少走弯路哈。这里以半导体激光器为例&#xff0c;讲PSpice的建模。 PSpice是啥&am…

如何保证三维激光扫描的测量精度?

非接触式扫描是三维扫描技术中的一个重要分支&#xff0c;具有检测速度快、零接触等优势&#xff0c;可以将复杂、不规则的物体三维点云数据采集到电脑中&#xff0c;并快速构建出三维模型。如今&#xff0c;三维激光扫描测量技术在文物、建筑等行业都有了成功的应用案例。 在…

激光雷达应用案例|仓储3D体积量方测量

在物流、仓储等工业行业中&#xff0c;获取物品体积数量、掌握物品出入库情况对生产库存管理具有重要意义。 以煤炭仓储及生产领域煤炭体积测量为例&#xff0c;为了解煤炭出入库情况&#xff0c;通常依靠人力手持全站仪进行人工煤炭体积监测。然而这一传统解决方案始终面对着技…

数学建模——光盘的数据容量

1、背景和问题 &#xff08;1&#xff09;20世纪80年代出现激光唱片&#xff08;CD&#xff09;与激光视盘&#xff08;LD&#xff09;&#xff0c;统称为光盘。 &#xff08;2&#xff09;20世纪90年代出现数字视频光盘&#xff08;DVD&#xff09;。 &#xff08;3&#x…