【数据结构】排序算法系列——插入排序(附源码+图解)
插入排序
算法思想
插入排序的算法思想其实很容易理解,它秉持着一个不变的循环:比较->交换->比较->交换…因为我们排序最终的目的是要得到递增或者递减的数据,那么在原有的数据中,我们可以将数据依次两两进行比较:
- 如果是升序,那么就将较小的放在较大的前面
- 如果是降序,那么就将较大的放在较小的前面
图解

我们看图解中,单次比较过程中,拿出来比较的数只会同它左侧的数进行比较,而被比较的数随着比较结束也会根据具体情况向后移动或者是进行交换,向后移动的过程也称为——补位。在全程的比较中,随着补位和交换的进行,进行比较操作的数只会与曾经进行过比较操作的数进行比较——简单来说,就是比较与被比较是交替进行的。我们总结插入排序算法的核心思路——将待排列元素划分为「已排序」和「未排序」两部分,每次从「未排序的」元素中选择一个插入到「已排序的」元素中的正确位置。
C语言代码分析
//升序情况
void InsertSort(int* arr, int n)
{int end = n - 1;//从最后一个数据开始进行比较int tmp = arr[end];//保存最后一个数据while (end >= 0){if (tmp <= arr[end])//当tmp小于等于arr[end]时,说明tmp还没有找到合适的位置{arr[end + 1] = arr[end];//那么就将arr[end]向后移动end--;//继续向前比较}else//当tmp大于arr[end]时,说明tmp已经找到了合适的位置{break;//那么就直接退出循环}}arr[end + 1] = tmp;
}//降序情况
void InsertSort2(int* arr, int n)
{int begin = 0;//从第一个数据开始进行比较int tmp = arr[begin];//保存第一个数据while (begin <= n - 1){if(tmp>=arr[begin])//当tmp大于等于arr[begin]时,说明tmp还没有找到合适的位置{arr[begin - 1] = arr[begin];//那么就将arr[begin]向后移动begin++;//继续向后比较}else//当tmp小于arr[begin]时,说明tmp已经找到了合适的位置{break;//那么就直接退出循环}arr[begin + 1] = tmp;
}
在现实生活中,扑克牌的排序事实上就是遵循着插入排序的思想:

时间复杂度
-
插入排序的最优时间复杂度为O(n),在数列几乎有序时效率很高。
-
插入排序的最坏时间复杂度和平均时间复杂度都为O(n2)。
稳定性
鉴于插入排序不会改变前后元素的相对位置,所以: 稳定
相关文章:
【数据结构】排序算法系列——插入排序(附源码+图解)
插入排序 算法思想 插入排序的算法思想其实很容易理解,它秉持着一个不变的循环:比较->交换->比较->交换…因为我们排序最终的目的是要得到递增或者递减的数据,那么在原有的数据中,我们可以将数据依次两两进行比较&…...
TOMATO靶机漏洞复现
步骤一,我们来到tomato页面 什么也弄不了只有一番茄图片 弱口令不行,xxs也不行,xxe还是不行 我们来使用kali来操作... 步骤二,使用dirb再扫一下, dirb http://172.16.1.133 1.发现这个文件可以访问.我们来访问一下 /antibot_i…...
高基数 GroupBy 在 SLS SQL 中的查询加速
作者:顾汉杰(执少) 什么是高基数 GroupBy 简单来说,想要分析的数据,拥有超多的“唯一值计数”(Distinct Count),而我们需要对这些数据进行分组分析(如统计次数、排名、…...
TP5队列和TP5 使用redis 等相关
TP5.thinkphp之门面(facade类)面试_thinkphp facade-CSDN博客 TP5中的消息队列_tp 5.0 队列 release 时间单位-CSDN博客 thinkphp-queue自带的队列包使用分析_php think queue:listen-CSDN博客TP5 使用redis_tp5 redis-CSDN博客...
【R语言速通】1.数据类型
文章目录 0. 变量名1.基本数据类型1.1 数值型1.2 整型1.3 复数型1.4 逻辑型1.5 字符型 2.复合数据类型2.1 向量向量操作向量的常用函数 2.2 矩阵矩阵操作矩阵的常用函数 2.3 数组数组的操作数据的运算数组的访问数组的维度操作 数组的常用函数 2.4 数据框数据框操作数据框的常用…...
【C++设计模式】(三)创建型模式:单例模式
文章目录 (三)创建型模式:单例模式饿汉式懒汉式饿汉式 v.s. 懒汉式 (三)创建型模式:单例模式 单例模式在于确保一个类只有一个实例,并提供一个全局访问点来访问该实例。在某些情况下࿰…...
基于Android Studio的行程记录APK开发指南(三)---界面设计及两种方法获取用户位置
前言 本系列教程我们来看看如何使用Android Studio去开发一个APK用于用户的实时行程记录 第一期:基于Android Studio的用户行程记录APK开发指南(一):项目基础配置与速通Kotlin-CSDN博客第二期:基于Android Studio的行程记录APK开发指南(二):…...
大厂趋势:低代码不等于低能力,赋能高效开发新纪元
大厂趋势:低代码不等于低能力,赋能高效开发新纪元 在数字化转型的浪潮中,科技巨头(大厂)作为行业的引领者,不断探索和创新,以应对日益复杂多变的市场需求和技术挑战。其中,“低代码…...
CentOS全面停服,国产化提速,央国企信创即时通讯/协同门户如何选型?
01. CentOS停服带来安全新风险, 国产操作系统迎来新的发展机遇 2024年6月30日,CentOS 7版本全面停服,于2014年发布的开源类服务器操作系统——CentOS全系列版本生命周期画上了句号。国内大量基于CentOS开发和适配的服务器及平台,…...
如何确定Kubernetes是在采用哪种方式进行部署的?
这里写目录标题 1. 查看 Kubernetes 安装方式的常见文件和工具2. 检查 Kubernetes 的节点信息3. 检查 Kubernetes API 服务器的版本信息4. 检查系统服务和容器5. 查看安装文档或管理员笔记为什么可以确定是 kubeadm 部署?下一步确认 如果存在多个master节点…...
【PostgreSQL】地理空间数据的数据类型定义、索引优化、查询优化策略
PostgreSQL 是开源关系型数据库,对于地理空间数据的处理提供了很好的支持。在处理地理空间数据时,优化索引和查询的性能至关重要,因为地理空间操作通常涉及大量的数据计算和复杂的几何形状比较。 一、地理空间数据类型 注意geometry和geogra…...
RocketMQ广播消费消息
1、 基础概念 RocketMQ 支持两种消息模式:集群消费( Clustering )和广播消费( Broadcasting )。 集群消费模式(Cluster): 在集群消费模式下,同一个消费者组(…...
C#基础(2)枚举
前言 我们其实在前面已经了解过枚举到底有什么作用,但是那毕竟是概念性的语言,理解起来很抽象,今天我们会具体来讲一讲枚举,并谈一谈它的应用。 希望你能从今天的C#基础中有所收获。 基本概念 1.枚举:是一个比较特…...
Linux之MySQL日志
前言 数据库就像一个庞大的图书馆,而日志则是记录这个图书馆内每一本书的目录。正如在图书馆中找到特定书籍一样,数据库日志帮助我们追溯数据的变更、定位问题和还原状态。 在MySQL中,日志是非常重要的一个组成部分,它记录了数据…...
Redis集群模式—主从集群、哨兵集群、分片集群
主从集群 主从模式中,包括一个主节点(Master)和一个或多个从节点(Slave)。主节点负责处理所有写操作和读操作,而从节点则复制主节点的数据,并且只能处理读操作。当主节点发生故障时,…...
并发工具类(二):CyclicBarrier
1、CyclicBarrier 介绍 从字面上看 CyclicBarrier 就是 一个循环屏障,它也是一个同步助手工具,它允许多个线程 在执行完相应的操作后彼此等待共同到达一个屏障点。 CyclicBarrier可以被循环使用,当屏障点值变为0之后,可以在接下来…...
Spring Cloud全解析:负载均衡之Ribbon简介
Ribbon简介 Ribbon是一种客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起,提供了一系列完善的配置如连接超时、重试等,Ribbon会自动的帮助基于某种规则(如简单轮询、随机连接等)去连接那些机器,也可以自定义的负载均衡…...
Kettle安装与使用指南
1. 介绍 什么是Kettle? Kettle,全称Pentaho Data Integration (PDI),是Pentaho BI套件的一部分。它提供了一个可视化的ETL工具,允许用户通过图形界面设计复杂的数据集成流程。Kettle支持多种数据源,包括关系型数据库…...
教育行业解决方案:智能PPT在教育行业的创新应用
在信息化时代,教育行业面临着巨大的变革。随着人工智能技术的不断发展,传统教学方式正在被重新定义。彩漩科技作为 AI 技术的先行者,推出了歌者 PPT &彩漩 PPT,为教师、学生和家长提供了一种全新的教育体验,实现了…...
Matlab程序练习
Part1 1.求 [100,999] 之间能被 21整除的数的个数。 程序: 主文件:main.m clear; start_num 100; end_num 999; div_num 21; res div(start_num,end_num,div_num); fprintf("[%d,%d]之间能被%d整除的数的个数为%d个\n",start_num,end_…...
YOLOv12与MATLAB联合仿真:算法原型快速验证与性能分析
YOLOv12与MATLAB联合仿真:算法原型快速验证与性能分析 对于习惯在MATLAB环境中工作的算法工程师和研究人员来说,一个常见的痛点在于:当需要验证前沿的深度学习目标检测算法(如最新的YOLOv12)时,往往不得不…...
写作柚助力高效论文写作之路
临近期末,很多大四学生都开始写论文了,可问题是,大学四年,学校并没有教我们怎么写论文,现在突然让写论文,写开题报告,修改论文,查重降重,写答辩PPT等等。在这毕业季&…...
保姆级教程:GPT-SoVITS一键部署,5秒语音克隆你的专属AI助手
保姆级教程:GPT-SoVITS一键部署,5秒语音克隆你的专属AI助手 1. 引言:为什么选择GPT-SoVITS 想象一下,你只需要录制5秒钟的语音,就能让AI用你的声音朗读任何文字——这就是GPT-SoVITS带来的神奇体验。作为当前最先进的…...
2025年Scratch图形化编程三级考试真题解析与备考策略
1. 2025年Scratch三级考试真题深度解析 最近帮几个小朋友准备Scratch三级考试,发现很多孩子做题时容易陷入"看着会做但总选错"的困境。就拿2025年6月这套真题来说,表面看都是基础题,但每道题都藏着几个易错点。比如第一题的多边形绘…...
SAMD微控制器安全Flash存储库设计与实践
1. 项目概述SAMD_SafeFlashStorage 是一款专为 SAMD21(如 Arduino Zero、MKR系列)和 SAMD51(如 Adafruit Metro M4、Arduino MKR VIDOR 4000)微控制器设计的安全型闪存数据存储库。它并非简单复刻,而是对原始 cmaglie/…...
MediaPipe人体姿态识别避坑指南:从环境配置到模型调优
MediaPipe人体姿态识别避坑指南:从环境配置到模型调优 人体姿态识别技术正在重塑人机交互的边界——从虚拟健身教练的实时动作纠正,到影视特效中的精准动作捕捉,这项技术正在多个领域展现惊人潜力。作为Google推出的跨平台解决方案࿰…...
为什么PyTorch基金会突然终止3个核心子项目?——2026奇点大会技术委员会首次披露AI原生开源治理白皮书(含5项强制合规条款)
第一章:PyTorch基金会治理突变事件全景速览 2026奇点智能技术大会(https://ml-summit.org) 2024年12月,PyTorch基金会宣布启动治理架构重大调整,标志着其从Meta主导的项目向真正中立、多利益相关方共治的开源基金会转型。此次变更并非渐进式…...
台达PLC伺服追剪程序及电子凸轮技术,含DVP15MC源代码与触摸屏程序一体化解决方案
台达PLC伺服追剪程序,电子凸轮,全部源代码,PLC程序和触摸屏程序,DVP15MC。最近在搞台达PLC的追剪项目,发现里面电子凸轮的设计挺有意思。直接上干货,咱们先看这个追剪系统的核心逻辑——电子凸轮的参数配置…...
语言的边界,与软件的命运憾
1. 引入 在现代 AI 工程中,Hugging Face 的 tokenizers 库已成为分词器的事实标准。不过 Hugging Face 的 tokenizers 是用 Rust 来实现的,官方只提供了 python 和 node 的绑定实现。要实现与 Hugging Face tokenizers 相同的行为,最好的办法…...
Diablo16串口库:Arduino驱动4D Systems图形屏实战指南
1. Diablo16-Serial-Arduino-Library 项目概述Diablo16-Serial-Arduino-Library 是一个专为 Arduino 平台设计的串行通信封装库,用于与 4D Systems 公司基于 Diablo16 图形处理器(GPU)的显示模块进行高效、可靠的指令交互。该库并非直接驱动 …...
