插入排序图解

article/2025/9/17 6:29:32

七大排序之插入排序

文章目录

  • 七大排序之插入排序
  • 前言
  • 一、直接插入排序
    • 1.1 算法图解
    • 1.2 算法稳定性
    • 1.3 插入排序和选择排序相比到底优在哪?
  • 二、折半插入排序
  • 总结


前言

博主个人社区:开发与算法学习社区

博主个人主页:Killing Vibe的博客

欢迎大家加入,一起交流学习~~

一、直接插入排序

插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

1.1 算法图解

其实就是打牌码牌的过程。

  • 将待排序的集合看做两部分,已排序的区间(0…i) ; 待排序的区间[i…n);
  • 每次选择无序区间的第一个元素插入到有序区间的合适位置,直到整个数组有序。

初始数据越接近有序,效率越高,经常作为高阶排序算法优化手段。

在这里插入图片描述

代码如下:

    public static void insertionSort(int[] arr) {for (int i = 1; i < arr.length; i++) {// 已排序区间[0...1)// 待排序区间[i ..n)// 选择无序区间的第一个元素,不断向前看// 注意看内层循环的终止条件 j >= 1而不是 j >= 0 ?// 因为此时arr[j] 不断向前看一个元素  j - 1 要合法 j - 1 >= 0for (int j = i; j >= 1 && arr[j] < arr[j - 1]; j--) {swap(arr,j,j - 1);
//                // 边界
//                if (arr[j] > arr[j - 1]) {
//                    // arr[i] 恰好是有序区间的后一个元素,无序区间的第一个元素
//                    // 当前无序区间的第一个元素 > 有序区间最后一个元素
//                    break;
//                }else {
//                    swap(arr,j,j - 1);
//                }}}}

注意事项:

当arr[i] > arr[i-1] 时 ,说明此时arr[i] 大于有序区间的所有元素!!!

直接跳过内层循环,外层i++

在这里插入图片描述

举个栗子:

算法走到一半时:

  • 有序区间: [1,2,3,4,5]
  • 无序区间:[6,9,8,7,2,10]

1.因为 6 > 5 , 所以直接跳过内层循环了,然后 i++

2.有序区间变成 [1,2,3,4,5,6]

3.只有当arr [i] < arr[i - 1] 的时候才需要移动元素

4.从当前元素不断向前看,往前交换 swap(arr,j,j-1)

5.一直碰到arr[j] > arr[j - 1] 就停止,即插入到了合适的位置。

1.2 算法稳定性

当arr[j] >= arr[j - 1] 不会交换其顺序,循环退出了。

在这里插入图片描述

所以插入排序一个稳定性的算法。

1.3 插入排序和选择排序相比到底优在哪?

1.和选择排序最大的区别:

当已经排序的集合的最后元素 < 当前无序区间的第一个元素,内层循环可以直接退出,大大降低了时间。

2.极端情况:

若待排序的数组就是一个完全升序数组,插入排序就会进化为O(n) = > 内层循环一次也不走,最好情况时间复杂度

二、折半插入排序

选择无序区间的第一个元素插入到”有序区间“的位置时,优化他的插入位置的查找次数。

也就是有序区间的查找用二分查找

代码如下:

    public static void insertionSortBS(int[] arr) {// 有序区间[0..i)// 无序区间[i..n)for (int i = 0; i < arr.length; i++) {int val = arr[i];// 有序区间[left...right)int left = 0;int right = i;while (left < right) {int mid = (left + right) / 2;if (val < arr[mid]) {right = mid;}else {// val >= arr[mid]left = mid + 1;}}// 搬移[left..i)的元素for (int j = i; j > left ; j--) {arr[j] = arr[j - 1];}// left就是待插入的位置arr[left] = val;}}

举个栗子:

当算法进行到一半时:

绿色框框已经是有序数组,红色是待排序数组。

在这里插入图片描述
对绿色框框里面的元素用二分查找的方法:

left = 0 ; right = i; mid = (left + right) / 2;

  • 第一轮开始 l = 0,r=5,mid = 2 ,比较当前元素和arr[mid]的大小关系,3<4, 就把right = mid = 2,往mid的左区间【1 2】来查找
  • 第二轮开始 l = 0 , r = 2, mid = 1 , 重复上述操作,3 > arr[mid] 也就是2,所以 l = mid+1 = 2
  • 第三轮开始 l= 2,r = 2,此时 l > = r 循环终止,此时需要插入的位置就是 l
  • 此时只需要将[l…i)的元素往后搬移即可

总结

以上就是插入排序的图解和代码,有什么疑问可以私信博主~有帮助的话可以关注博主后续更新。


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

相关文章

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…

管网三维激光扫描建模_BIM建模_可视化平台_吉优赛维数字孪生

这几年我国的能源领域已经得到了飞速的发展基础&#xff0c;基础建设也得到了长效的发展&#xff0c;那么现在在石油天然气的运输过程当中&#xff0c;是否已经做到了没有任何的后患之忧了呢&#xff1f;实际上现在的传统人工管理方式还是存在很大程度上的安全盲区的&#xff0…