算法基础三:插入排序
定义
插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到 {\displaystyle O(1)} {\displaystyle O(1)}的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后
挪位,为最新元素提供插入空间。
特性
1.时间复杂度
最好情况就是全部有序,此时只需遍历一次,最好的时间复杂度为O ( n ) O(n)O(n)
最坏情况全部反序,内层每次遍历已排序部分,最坏时间复杂度为O ( n 2 ) O(n^2)O(n2)
综上,因此直接插入排序的平均时间复杂度为O ( n 2 ) O(n^2)O(n2)
2.空间复杂度
辅助空间是常量
平均的空间复杂度为:O ( 1 ) O(1)O(1)
3.算法稳定性
相同元素的前后顺序是否改变
插入到比它大的数前面,所以直接插入排序是稳定的
举例说明原理
原理文字太枯燥了,以下用数组3,4,6,7,9,1,2,5为例
从小到大排序
1、首先选择第一个数,由于第一个数必然有序,丨前面为有序组、后面为无序。
3 | 6 7 9 1 2 5
2、取出无序部分的首个,在有序部分从后向前比较,插入到合适的位置
3 6 | 7 9 1 2 5
3、重复第2步直到无序部分全部插入有序,7和9也是一次比较就可以插入
3 6 7 | 9 1 2 5
3 6 7 9 | 1 2 5
4、1就需要多次比较,注意是多次比较,直接插入,不是比较一次插入一次(与冒泡不同)
3 6 7 9 口 | 2 5
temp = 1
可以看到先把1放到temp中,与前面比较,最后放到合适位置
1 3 6 7 9 | 2 5
5、后面就重复上面操作
1 2 3 5 6 7 9
以下为C语言代码并附上代码解析带图
一:C语言代码
#include <stdio.h>// 函数声明
void insertion_sort(int arr[], int len);int main() {int arr[] = { 22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70 };int len = sizeof(arr) / sizeof(arr[0]); // 计算数组长度insertion_sort(arr, len); // 调用插入排序函数// 打印排序后的数组for (int i = 0; i < len; i++) {printf("%d ", arr[i]);}return 0;
}
void insertion_sort(int arr[], int len) {for (int i = 1; i < len; i++){int temp = arr[i];int j = i;while (j > 0 && arr[j - 1] > temp) {arr[j] = arr[j - 1];j--;}arr[j] = temp;}
}
二:代码解析
1、我们逐句分析,先看第一句,很简单从数组地址为1开始遍历
3 | 6 7 9 1 2 5
for (int i = 1; i < len; i++)
2、将数放进temp中,地址存进j中
int temp = arr[i];int j = i;
3 口 | 7 9 1 2 5
temp = 6
6所在地址1存进j中
3、前面还有数并且取出的数小于有序组最后一个
while (j > 0 && arr[j - 1] > temp)
3 7 9 口| 2 5
temp = 11前面有数并且9>1
4、前面比他大的数往后移;接着地址减小再进while
arr[j] = arr[j - 1];j--;
3 7 口 9| 1 2 5
temp = 1
5、最终放到合适地方
arr[j] = temp;
口 3 7 9 | 2 5
temp = 1放下以后:1 3 7 9 | 2 5
如下是用插入排序算法对 {14, 33, 27, 10, 35, 19, 42, 44} 实现升序排序的 Python 程序:
#待排序序列
list = [10, 14, 19, 27, 33, 35, 42, 44]
def insertion_sort():length = len(list)# 从第 2 个元素(下标为 1)开始遍历for i in range(1,length):# 记录要插入的目标元素insert_elem = list[i];position = i# 从 position 向前遍历,找到目标元素的插入位置while position > 0 and list[position -1] > insert_elem:#position 处的元素向后移动一个位置list[position] = list[position -1];position = position-1# 将目标元素插入到指定的位置if position != i:list[position] = insert_elem
insertion_sort()# 输出已排好序的序列
for i in list:print(i,end=" ")
相关文章:
算法基础三:插入排序
定义 插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用…...
小米汽车加速出海,官网建设引领海外市场布局!
面对国内市场的饱和态势,中国企业出海步伐纷纷加速,小米也是其中的一员。Canalys数据显示,2024年第三季度,小米以13.8%的市场份额占比,实现了连续17个季度位居全球前三的成绩。 据“36 氪汽车”报道,小米汽…...
Python Polars快速入门指南:LazyFrames
前文已经介绍了Polars的Dataframe, Contexts 和 Expressions,本文继续介绍Polars的惰性API。惰性API是该库最强大的功能之一,使用惰性API可以设定一系列操作,而无需立即运行它们。相反,这些操作被保存为计算图,只在必要…...
什么是网络安全(Cybersecurity)?
不同组织机构对网络安全(Cybersecurity或Cyber Security)的定义不尽相同。从目标上来说,网络安全主要用于保护网络、计算机、移动设备、应用程序及数据等资产免受网络攻击,避免造成数据泄露、业务中断等安全问题。 网络钓鱼、勒索…...
VBA批量插入图片到PPT,一页一图
Sub InsertPicturesIntoSlides()Dim pptApp As ObjectDim pptPres As ObjectDim pptSlide As ObjectDim strFolderPath As StringDim strFileName As StringDim i As Integer 设置图片文件夹路径strFolderPath "C:\您的图片文件夹路径\" 请替换为您的图片文件夹路径…...
Pandas-DataFrame入门
文章目录 一. Pandas DataFrame简介二. 加载数据集1. 目的2. 步骤① 导包② 加载csv③ 查看数据类型及属性④ Pandas与Python常用数据类型对照 三. 查看部分数据1. 根据列名加载部分列数据① 加载一列数据,通过df[列名]方式获取② 加载多列数据,通过df[[…...
爬虫 - 爬取王者荣耀所有皮肤图片
结果展示 安装 pip install requests logger代码 import json import os import re from concurrent.futures import ThreadPoolExecutorimport requests from loguru import loggerdef parse_url(url, bFalse):try:headers {"User-Agent": "Mozilla/5.0 (Wi…...
【畅购商城】购物车模块之查看购物车
目录 分析 接口 后端实现 前端实现:显示页面 前端实现:显示购物车信息 分析 用户如果没有登录,购物车存放在浏览器端的localStorage处,且以数组的方式进行存储。用户如果登录了,购物车存放在redis中,…...
Spring Boot 学习笔记
学习代码第一步:如何写 Hello world ? 1、新建项目 新建一个 Maven Java 工程,在 pom.xml 文件中添加 Spring Boot Maven 依赖: <parent><groupId>org.springframework.boot</groupId><artifactId>spri…...
快速打造智能应用:从设计到上线的全流程指南
随着人工智能技术的快速发展,如何将大模型技术转化为实际应用成为了各行业关注的焦点。本文将以一个经典的 RAG(检索增强生成)知识问答系统为例,详细介绍从智能体设计到最终应用部署的全流程。通过结合阿里云的魔笔低代码平台和丰…...
Java-将一个大列表均分成多个小列表,每个小列表包含10个元素
要将一个大列表均分成多个小列表,每个小列表包含10个元素,可以使用多种方法。以下是几种常 见的方法: 方法一:使用 subList 这是你已经提到的方法,通过 subList 来获取子列表。 import java.util.ArrayList; import java.util.List;public class BatchProcessingExamp…...
tcp_rcv_synsent_state_process函数
tcp_rcv_synsent_state_process 是 Linux Kernel 中用于处理 TCP 连接在 SYN-SENT 状态下接收到报文的函数。这个函数在 TCP 三次握手阶段起到了至关重要的作用,处理了在客户端发送 SYN 请求之后收到服务器响应报文的各种情况。 以下是这个函数的解读和剖析: int tcp_rcv_sy…...
关于无线AP信道调整的优化(锐捷)
目录 一、信道优化的基本原则二、2.4G频段信道优化三、5G频段信道优化四、信道优化代码具体示例五、其他优化措施 一、信道优化的基本原则 信道优化旨在减少信道间的干扰,提高网络覆盖范围和信号质量。基本原则包括: 1. 选择合适的信道:根据…...
C#编写的金鱼趣味小应用 - 开源研究系列文章
今天逛网,在GitHub中文网上发现一个源码,里面有这个金鱼小应用,于是就下载下来,根据自己的C#架构模板进行了更改,最终形成了这个例子。 1、 项目目录; 2、 源码介绍; 1) 初始化; 将样…...
计算机网络|数据流向剖析与分层模型详解
文章目录 一、网络中的数据流向二、计算机网络通信模型1.OSI 模型2.TCP/IP 模型3.TCP/IP五层模型3.1 分层架构描述3.2各层地址结构3.3UDP数据包报头结构 三、总结 一、网络中的数据流向 在计算机网络中,数据的流向是指数据从发送端到接收端的传输路径。数据流向涉及…...
某些iphone手机录音获取流stream延迟问题 以及 录音一次第二次不录音问题
一些型号的iphone手机录音获取流stream延迟问题 以及 录音一次第二次不录音问题 延迟问题 navigator.mediaDevices.getUserMedia({ audio: true }) .then((stream) > {console.log(stream) })从开始到获取stream会有将近2s的延迟 导致按下按钮开始录音 会有前…...
gazebo_world 基本围墙。
如何使用? 参考gazebo harmonic的官方教程。 本人使用harmonic的template,在里面进行修改就可以分流畅地使用下去。 以下是world 文件. <?xml version"1.0" ?> <!--Try sending commands:gz topic -t "/model/diff_drive/…...
Ubuntu 上高效实现 Texlive 安装和管理
文章目录 介绍操作步骤1. 下载 Texlive 安装包2. 解压安装包3. 安装基础安装命令通用的 scheme 选项 4. 配置环境变量 使用 tlmgr 管理包总结 介绍 Texlive 是学术和技术文档编写的重要工具, 选择适合的安装方案能帮助您提升效率并减少磁盘空间占用. 本文将为您提供在 Ubuntu …...
LeetCOde914 卡牌分组
扑克牌分组问题:探索最大公约数的应用 在编程的世界里,我们经常会遇到各种有趣的算法问题,今天要和大家分享的是一道关于扑克牌分组的问题,它巧妙地运用了最大公约数的概念来解决。 一、问题描述 给定一副牌,每张牌…...
MicroDiffusion——采用新的掩码方法和改进的 Transformer 架构,实现了低预算的扩散模型
介绍 论文地址:https://arxiv.org/abs/2407.15811 现代图像生成模型擅长创建自然、高质量的内容,每年生成的图像超过十亿幅。然而,从头开始训练这些模型极其昂贵和耗时。文本到图像(T2I)扩散模型降低了部分计算成本&a…...
M2LOrder API文档实战:Swagger交互式调试/predict接口参数详解
M2LOrder API文档实战:Swagger交互式调试/predict接口参数详解 1. 引言:从WebUI到API,解锁情绪识别的自动化能力 如果你已经体验过M2LOrder的WebUI界面,用那个简洁的网页输入文字、点击按钮,然后看着它分析出“happy…...
Flutter应用安全保护:代码混淆的重要性与Android/iOS混淆步骤详解
前言 本文将会和大家说下保护代码的重要性,和如何给程序加上混淆编译功能。 尽可能的不要在你的程序中写死各种服务秘钥,比如 oss 容易被盗用。 参考 https://docs.flutter.dev/deployment/obfuscatehttps://www.guardsquare.com/blog/obstacles-in-…...
凌晨两点,我终于在极空间上跑通了第一个私人博客
凌晨两点,窗外安静得只剩空调的嗡嗡声。 小孩刚哄睡,我蹑手蹑脚坐到电脑前,打开极空间的 SSH 终端。这台设备买了快一年了,当初图它操作简单、设置不费脑子,结果除了跑过两次照片备份,基本上就是客厅里的高…...
vLLM加速Qwen2.5-7B推理:LoRA权重加载与性能测试
vLLM加速Qwen2.5-7B推理:LoRA权重加载与性能测试 1. 前言 在大语言模型推理中集成LoRA权重已成为提升特定任务性能的有效方法。通过低秩适配技术,LoRA能够在保持模型原有能力的同时,显著减少需要调优的参数数量。这种轻量级微调方式不仅降低…...
GTE中文文本嵌入模型智能助手:客服工单语义聚类实战
GTE中文文本嵌入模型智能助手:客服工单语义聚类实战 1. 引言:从客服工单的烦恼说起 想象一下,你是一家电商公司的客服主管。每天,你的团队要处理成千上万条用户反馈和工单。用户的问题五花八门:“我的快递怎么还没到…...
restrict关键字:提升指针性能的提示
文章目录理解 restrict 关键字:提升指针性能的提示 🚀什么是 restrict 关键字? 🤔为什么 restrict 重要? 💡如何使用 restrict? 🛠️代码示例:性能对比 📊Mer…...
VSCode下载与配置Starry Night Art Gallery开发环境
VSCode下载与配置Starry Night Art Gallery开发环境 如果你对“Starry Night Art Gallery”这个项目感兴趣,想动手参与开发或者自己搭建一个类似的数字艺术画廊,那么第一步就是准备好趁手的开发工具。Visual Studio Code(简称VSCode…...
李宏毅老师最新大模型入门教程,带你快速掌握生成式AI核心,轻松进阶前沿水平!
现在国内外关于大模型入门教程做的比较好的并不多,这其实也是一件好事,有难度和有门槛才能避免烂大街,现在大模型入门教程热度最高的包括李宏毅老师、吴恩达老师、Datawhale开源社区等 选择合适的入门学习教程,能少走弯路…...
多租户下的ERP系统的仓储管理模块分析设计茸
springboot自动配置 自动配置了大量组件,配置信息可以在application.properties文件中修改。 当添加了特定的Starter POM后,springboot会根据类路径上的jar包来自动配置bean(比如:springboot发现类路径上的MyBatis相关类ÿ…...
ollama v0.20.4 正式发布!MLX 性能大幅提升 , Gemma4 闪光注意力全面启用
前言 2026年4月9日,本地大模型运行框架ollama正式推出v0.20.4 Latest稳定版本。本次更新围绕MLX硬件加速性能优化、Gemma4系列模型支持、前端代码规范、Safetensors模型创建流程、函数调用输出能力、MLX动态库兼容、集成测试体系搭建等多个核心维度展开,…...
