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

【保姆级图解】插入排序 算法详解:直接插入排序、希尔排序

 总体引入

在计算机科学的算法领域中,排序是一项基础且重要的操作。它旨在将一组无序的数据元素重新排列为有序序列,以满足特定的顺序要求,如升序或降序。常见的排序算法可分为不同类别,像插入排序,包含直接插入排序和希尔排序;选择排序,有直接选择排序和堆排序;交换排序,涵盖冒泡排序和快速排序;还有归并排序 。这些算法各有特点,适用于不同的应用场景,接下来让我们深入了解它们。

 

插入排序引入

想象你整理扑克牌时,会从一堆牌里一张一张拿出来,按顺序插到已经整理好的牌堆合适位置 。编程里的插入排序差不多也是这个道理。它把数据分成已排序和未排序两部分,从 未排序部分取元素,在已排序部分找到合适位置插入,不断重复,直到所有元素都排好序,就像把乱序的扑克牌整理成有序的一样。

一、直接插入排序(Insertion Sort)

算法思想
将数组分为“已排序”和“未排序”两部分,逐个将未排序部分的元素插入到已排序部分的正确位置。

代码解析

void InsertSort(int* arr, int n) {for (int i = 0; i < n - 1; i++) {  // 从第一个元素开始遍历到倒数第二个元素int end = i;                   // 已排序部分的末尾索引int tmp = arr[end + 1];        // 待插入元素(未排序部分的第一个元素)while (end >= 0) {             // 向前寻找插入位置if (arr[end] > tmp) {      // 若当前元素大于待插入元素,则后移arr[end + 1] = arr[end];end--;} else {                   // 找到合适位置,退出循环break;}}arr[end + 1] = tmp;            // 插入元素到正确位置}
}

步骤说明

  1. 外层循环:遍历每个待插入元素(从第二个元素开始)。

  2. 内层循环:从后向前比较,若当前元素比待插入元素大,则将其后移。

  3. 插入操作:找到第一个比待插入元素小的位置,将元素插入其后。

复杂度分析

  • 时间复杂度:

    • 最好情况(已有序):O(n),只需比较无需移动。

    • 最坏情况(逆序):O(n²),每次插入需移动全部已排序元素。

  • 空间复杂度:O(1),原地排序。

适用场景
数据量小或基本有序时效率高,稳定且简单。


二、希尔排序(Shell Sort)

算法思想
希尔排序是对直接插入排序的一种改进算法,它通过将待排序的数组按照一定的间隔(称为增量)进行分组,对每组分别进行直接插入排序,逐步缩小增量,当 gap > 1 时都是预排序,⽬的是让数组更接近于有序。当 gap == 1 时,数组已经接近有序的了,这样就会很快。这样整体⽽⾔,可以达到优化的效果。

代码解析

void ShellSort(int* arr, int n) {int gap = n;                       // 初始间隔设为数组长度while (gap > 1) {                  // 循环直到间隔为1(最后一次完整插入排序)gap = gap / 3 + 1;            // 动态调整间隔(常见增量方式)for (int i = 0; i < n - gap; i++) {  // 对所有间隔分组进行插入排序int end = i;               // 当前组的已排序末尾int tmp = arr[end + gap]; // 待插入元素while (end >= 0) {        // 组内插入排序if (arr[end] > tmp) {  arr[end + gap] = arr[end];end -= gap;        // 跨间隔移动} else {break;}}arr[end + gap] = tmp;      // 插入元素}}
}

步骤说明

  1. 动态调整间隔:初始间隔较大,逐步缩小(gap = gap/3 + 1)或者(gap = gap/2)

  2. 分组插入排序:对每个间隔形成的子序列进行插入排序。

  3. 最终排序:当间隔为1时,退化为标准插入排序,此时数组已基本有序。

复杂度分析

  • 时间复杂度:约 O(n^1.3),依赖增量序列的选择。

  • 空间复杂度:O(1),原地排序。

适用场景
中等规模数据,对稳定性无要求,优于直接插入排序。


测试案例
void test01() {int arr[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0};int size = sizeof(arr) / sizeof(arr[0]);// InsertSort(arr, size);ShellSort(arr, size);for (int i = 0; i < size; i++) {printf("%d ", arr[i]);  // 输出:0 1 2 3 4 5 6 7 8 9}
}

运行结果
无论调用哪个排序函数,最终输出均为有序数组 0 1 2 3 4 5 6 7 8 9


总结
  • 直接插入排序:简单稳定,适合小数据或部分有序场景。

  • 希尔排序:插入排序的高效改进,适合中等规模数据。

理解基础排序算法的实现有助于掌握更复杂的排序技术,实际应用中可根据数据特征选择合适的算法。

相关文章:

【保姆级图解】插入排序 算法详解:直接插入排序、希尔排序

总体引入 在计算机科学的算法领域中&#xff0c;排序是一项基础且重要的操作。它旨在将一组无序的数据元素重新排列为有序序列&#xff0c;以满足特定的顺序要求&#xff0c;如升序或降序。常见的排序算法可分为不同类别&#xff0c;像插入排序&#xff0c;包含直接插入排序和…...

Python爬虫第10节-lxml解析库用 XPath 解析网页

目录 引言 一、XPath简介 二、XPath常用规则 三、实例讲解 四、节点的选取 4.1 所有节点的选取 4.2 子节点的选取 4.3 父节点选取 五、属性匹配获取及文本获取 5.1 属性匹配 5.2 文本获取 5.3 属性获取 5.4 属性多值匹配 5.5 多属性匹配 六、按序选择 七、节点…...

Prometheus有哪几种服务发现?

Prometheus 支持多种服务发现 (Service Discovery) 机制&#xff0c;用于自动发现需要监控的目标。这些服务发现机制主要分为以下几类&#xff1a; 1. 静态配置 (Static Configuration) Static Configuration: 手动定义静态目标列表。适用于小规模的、固定的目标环境&#xf…...

突破焊丝虚影干扰,端子焊点缺陷检测如何实现自动化?

端子焊点作为 3C 产品中连接电路的关键环节&#xff0c;其质量优劣对产品性能有着决定性影响。然而&#xff0c;传统人工检测端子焊点不仅效率低下&#xff0c;难以满足大规模生产需求&#xff0c;而且误判率高&#xff0c;无法精准把控产品质量&#xff0c;成为企业提质增效智…...

2025.04.10-拼多多春招笔试第二题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 糖果店的优惠兑换计划 问题描述 K小姐开了一家糖果店,推出了一种特殊的兑换活动。商店有 n n n<...

linux系统下如何提交git和调试

我们默认的ubuntu20.04镜像是没有Git提交的工具&#xff0c;我们需要配置安装包。 安装和更新git的命令 sudo apt update //用于更新软件包索引sudo apt install git //用于安装git版本控制工具 git --version //检查git版本,确认是否安装成功 随便进入linux系统下的一…...

40页的IPD流程指标字典【全文精读】

该文档聚焦 IPD 流程指标&#xff0c;为企业在产品研发管理领域提供全面量化评估标准&#xff0c;主要适用于企业中与产品研发、管理、财务及市场相关的各类人员。 财务类指标&#xff1a;涵盖市场份额、新产品销售比重等&#xff0c;用于评估产品市场竞争力、投资效率…...

如何在Cherry Studio中配置MCP工具服务?国内MCP服务有哪些?

在当今数字化时代&#xff0c;AI助手已成为提升工作效率和创造力的重要工具。Cherry Studio作为一个全能的AI客户端&#xff0c;支持多平台&#xff08;包括Windows、macOS和Linux&#xff09;&#xff0c;并提供了丰富的功能&#xff0c;如大模型对话、AI绘图和AI翻译等。为了…...

动态词槽管理系统深度设计

动态词槽管理系统深度设计 基于Dual-Encoder的实时增量式语义槽管理方案 一、Dual-Encoder架构优化 1.1 架构创新设计 增强型双塔模型结构&#xff1a; #mermaid-svg-DRhtmuANYnJBJzpu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill…...

网络安全中信息收集需要收集哪些信息了?汇总

目录 1. 域名信息 2. IP地址与网络信息 3. 备案与注册信息 4. Web应用与中间件信息 5. 操作系统与服务器信息 6. 敏感文件与配置文件 7. 社交工程信息 8. 证书与加密信息 9. API与接口信息 10. 外部威胁情报 11. 历史数据与缓存 常用工具与技术&#xff1a; 在网络…...

代码模板-线段树(区间修改,区间查询和和最值)

题目链接&#xff1a;1270. 数列区间最大值 - AcWing题库 代码&#xff1a; // #pragma GCC optimize(1) // #pragma GCC optimize(2) // #pragma GCC optimize(3,"Ofast","inline")#include<bits/stdc.h> using namespace std; typedef long long…...

LLM介绍

一、核心概念与能力边界 LLM&#xff08;Large Language Model&#xff1a;大语言模型&#xff09;是基于海量文本训练的深度学习模型&#xff0c;其核心能力源于Transformer架构与自监督学习机制。关键特征包括&#xff1a; 参数规模&#xff1a;千亿级参数&#xff08;如GP…...

[数据结构]排序

目录 1、排序的概念 2、常见排序算法 3、直接插入排序 4、希尔排序 5、直接选择排序 6、堆排序 7、冒泡排序 1、排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作 …...

Next.js + Droplet:高并发视频内容平台部署与优化扩展实战

在构建在线服务时&#xff0c;无论你是开发者还是企业技术负责人&#xff0c;扩展性和稳定性始终是绕不开的核心挑战。尤其在涉及高并发访问、大量数据传输和持续内容分发的场景中&#xff0c;系统架构的设计直接决定了用户体验与业务成效。 本文将以视频点播&#xff08;Video…...

django寻味美食分享与交流网站-计算机毕业设计源码74984

摘 要 美食分享与交流网站是当前社交网络领域的一个热门话题。本研究旨在探讨用户在美食分享网站上的行为和互动模式&#xff0c;以及他们分享和获取美食信息的动机和方式。通过对美食分享网站上用户发文内容和互动数据的分析&#xff0c;揭示了用户在美食分享中的需求和行为规…...

把读写函数里的printf 打印到文件里

使用 fprintf 函数 将输出目标从标准输出&#xff08;stdout&#xff09;更改为一个文件指针 1、首先&#xff0c;在头文件或全局变量中定义一个 FILE 类型的指针&#xff0c;用于指向输出文件。 2、在程序启动时&#xff0c;打开文件并将文件指针赋值给上面定义的全局指针。…...

在idea中看spring源码

一、搭建环境 1.1 下载源码到本地 在github中找到spring-framework项目&#xff0c;或者这个地址&#xff08;https://github.com/spring-projects/spring-framework&#xff09; 然后把项目下载到本地目录&#xff0c;如图 1.2 然后用idea打开这个项目 1.3 然后等构建&…...

用最简单的方式讲述离散傅里叶级数(DFS)以及离散傅立叶变换(DFT)

文章目录 前言 一、傅里叶变换的多种形式 二、浅谈离散傅里叶级数&#xff08;DFS&#xff09; 三、浅谈离散傅里叶变换&#xff08;DFT&#xff09; 总结 前言 本文对四种不同的傅里叶变换做了总结与梳理&#xff0c;并针对其中存在联系的形式做了推导。接着又讲述了离散傅里叶…...

python基础语法14-多线程与多进程

Python 多线程与多进程详解 在 Python 中&#xff0c;多线程和多进程是常用的并发编程技术&#xff0c;它们可以帮助程序在处理大量任务时提高效率。Python 提供了多个模块来支持多线程和多进程的开发&#xff0c;包括 threading、multiprocessing 和 asyncio。本文将详细介绍…...

深入解析策略模式在C#中的应用与实现

策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它通过将一系列算法封装成不同的策略类&#xff0c;使得算法的选择和使用可以在运行时动态改变&#xff0c;且算法的变化对使用者透明。这种模式可以显著减少程序中的条件判断&#xff08;如…...

ios按键精灵脚本开发游戏辅助工具的代码逻辑

iOS 按键精灵使用 MQ 语言开发游戏脚本&#xff0c;其代码逻辑围绕游戏内的各种操作展开。我将从常见的游戏操作&#xff0c;如点击、移动等方面&#xff0c; 点击操作逻辑​ 在游戏中&#xff0c;点击操作是最基础的交互方式之一。比如要实现点击游戏界面上某个固定位置的 “…...

Pycharm(十三)容器类型的公共运算符和公共方法

一、容器类型的公共运算符 这些运算符是可以作用到 容器类型 中的。 常见的如下&#xff1a; &#xff1a;拼接&#xff0c;适用于字符串、列表、元组&#xff1b; *&#xff1a;复制&#xff0c;适用于字符串、列表、元组&#xff1b; in:是否包含,适用于字符串、列表、元…...

Backtrader从0到1——第一个回测策略

Backtrader从0到1——第一个回测策略 0. 前言1. lines && index2. 生成大脑3. 设置起始资金和佣金4. 添加数据&#xff08;重点&#xff09;5. 第一个策略——双均线5.1 策略类5.2 策略参数5.3 添加指标5.4 买卖与订单order5.5 完整策略代码 0. 前言 本人翻阅了大量资料…...

GPT - 因果掩码(Causal Mask)

本节代码定义了一个函数 causal_mask&#xff0c;用于生成因果掩码&#xff08;Causal Mask&#xff09;。因果掩码通常用于自注意力机制中&#xff0c;以确保模型在解码时只能看到当前及之前的位置&#xff0c;而不能看到未来的信息。这种掩码在自然语言处理任务&#xff08;如…...

lombok的坑

我使用lombok的Data注解带来的坑。 代码如下&#xff1a; 公共类&#xff1a; package com.tyler.oshi.common;import lombok.Data; import lombok.NoArgsConstructor;/*** author: TylerZhong* description:*/Data NoArgsConstructor public class R {private int code;priv…...

基于Python的网络爬虫技术研究

基于Python的网络爬虫技术研究 以下从多个方面为你介绍基于 Python 的网络爬虫技术&#xff1a; 概述 网络爬虫是一种自动获取网页内容的程序&#xff0c;在 Python 中可以借助诸多强大的库和工具实现。网络爬虫能应用于数据采集、搜索引擎、舆情监测等众多领域。 核心库 …...

微信小程序跳6

//金额格式化 rmoney: function(money) { return parseFloat(money).toFixed(2).toString().split().reverse().join().replace(/(\d{3})/g, $1,) .replace( /\,$/, ).split().reverse().join(); }, daysUntil: function(milliseconds) { const endDate new Date(milliseconds…...

项目1笔记

Data Data 是一个常用的 Lombok 注解&#xff0c;主要用于 Java 类中&#xff0c;可以自动生成以下内容&#xff1a; Getter&#xff08;所有字段&#xff09; Setter&#xff08;所有非 final 字段&#xff09; toString() 方法 equals() 和 hashCode() 方法 无参构造函…...

分享:批量识别图片文字并重命名,根据图片文字内容对图片批量重命名,Python和Tesseract OCR的完成方案

一、项目背景 在日常工作中,处理大量图片文件时,常常需要从图片中提取文字信息,并根据提取的文字对图片进行重命名。传统的手动操作方式效率低下且容易出错。通过OCR(光学字符识别)技术,可以自动从图片中提取文字信息,并基于提取的文字对图片进行批量重命名。 Tesserac…...

【安全】加密算法原理与实战

为了理解SSL/TLS原理&#xff0c;大家需要掌握一些加密算法的基础知识。当然&#xff0c;这不是为了让大家成为密码学专家&#xff0c;所以只需对基础的加密算法有一些了解即可。基础的加密算法主要有哈希&#xff08;Hash&#xff0c;或称为散列&#xff09;​、对称加密(Symm…...

STM32STM8芯片擦除与读保护

连接STM单片机与断开单片机连接&#xff0c; 点击擦除就可以了。 文件选HEX在选择Verify进行下载。...

Qwen2.5技术报告阅读

论文概述 ⸻ &#x1f9e0; 1. 模型概述 Qwen2.5 是阿里巴巴推出的一系列大语言模型&#xff08;LLMs&#xff09;&#xff0c;在 预训练数据量 和 后训练方法 上都比前一代 Qwen2 有了显著提升。 ⸻ &#x1f4c8; 2. 模型特点 • 预训练数据量提升&#xff1a;从 7 万亿…...

HDCP(二)

HDCP加密算法实现详解 HDCP&#xff08;高带宽数字内容保护&#xff09;的加密算法实现涉及对称加密、密钥派生、动态同步机制等核心环节&#xff0c;其设计兼顾实时性与安全性。以下从算法类型、流程实现、硬件集成等角度展开分析&#xff1a; 1. 加密算法类型与版本差异 •…...

POSIX线程(pthread)库:线程的终止与管理

在POSIX线程&#xff08;pthread&#xff09;库中&#xff0c;线程的终止和管理涉及多个关键函数。以下是关于线程终止的pthread系列函数的详细介绍&#xff1a; 1. pthread_exit&#xff1a;线程主动退出 ✨ 功能&#xff1a; 允许线程主动终止自身&#xff0c;并返回一个退出…...

Elasticsearch 系列专题 - 第三篇:搜索与查询

搜索是 Elasticsearch 的核心功能之一。本篇将介绍如何构建高效的查询、优化搜索结果,以及调整相关性评分,帮助你充分发挥 Elasticsearch 的搜索能力。 1. 基础查询 1.1 Match Query 与 Term Query 的区别 Match Query:用于全文搜索,会对查询词进行分词。 GET /my_index/_…...

【AI提示词】Emoji风格排版艺术与设计哲学

提示说明 Emoji风格排版艺术与设计哲学。 提示词 请使用 Emoji 风格编辑以下段落&#xff0c;该风格以引人入胜的标题、每个段落中包含表情符号和在末尾添加相关标签为特点。请确保保持原文的意思。使用案例&#xff08;春日穿搭&#xff09; &#x1f338; 2025春季穿搭灵…...

C语言 ——— 认识C语言

认识 main 函数 main 函数是程序的入口&#xff0c;程序执行时会从 main 函数的第一行开始执行&#xff0c;且一个工程中 main 函数有且只有一个 标准的 main 函数格式&#xff1a; int main() {return 0; } int 是类型&#xff0c;这里指的是 main 函数的返回类型 return…...

44、Spring Boot 详细讲义(一)

Spring Boot 详细讲义 目录 Spring Boot 简介Spring Boot 快速入门Spring Boot 核心功能Spring Boot 技术栈与集成Spring Boot 高级主题Spring Boot 项目实战Spring Boot 最佳实践总结 一、Spring Boot 简介 1. Spring Boot 概念和核心特点 1.1、什么是 Spring Boot&#…...

STM32硬件IIC+DMA驱动OLED显示——释放CPU资源,提升实时性

目录 前言 一、软件IIC与硬件IIC 1、软件IIC 2、硬件IIC 二、STM32CubeMX配置KEIL配置 三、OLED驱动示例 1、0.96寸OLED 2、OLED驱动程序 3、运用示例 4、效果展示 总结 前言 0.96寸OLED屏是一个很常见的显示模块&#xff0c;其驱动方式在用采IIC通讯时&#xff0c;常用软件IIC…...

Android 中绕过hwbinder 实现跨模块对audio 的HAL调用

需求 Audio 模块中专门为 TV 产品添加了一些代码&#xff0c;需要在 hdmi 的 HAL 代码中进行调用以完成某些功能。 解决方法 首先将 hdmi HAL 要调用的 audio 接口函数所在的 .so 链接到最基本的 lib.primay.amlogic.so 中&#xff08;其它平台上这个 .so 文件的名字也可能是…...

基于单片机技术的手持式酒精检测电路设计

基于STC89C52单片机的酒精检测仪设计 目录 基于STC89C52单片机的酒精检测仪设计一、简介二、酒精测试仪总体方案设计2.1 酒精检测仪设计要求分析2.2 设计框图 三、硬件设计3.1 酒精检测电路3.2 模数转换电路3.3 STC89c52单片机电路3.4 LED显示电路3.5 声光报警电路3.6 按键和复…...

【车道线检测(0)】卷首语

车道线检测领域&#xff0c;早期的LaneNet、CondLaneNet等模型。现在在精度、实时性、复杂场景适应性等方面有了更多进展。 ​Head&#xff08;输出头&#xff09;的设计角度分类 在车道线检测任务中&#xff0c;Head&#xff08;输出头&#xff09;的设计角度直接影响模型的…...

记一次某网络安全比赛三阶段webserver应急响应解题过程

0X01 任务说明 0X02 靶机介绍 Webserver&#xff08;Web服务器&#xff09;是一种软件或硬件设备&#xff0c;用于接收、处理并响应来自客户端&#xff08;如浏览器&#xff09;的HTTP请求&#xff0c;提供网页、图片、视频等静态或动态内容&#xff0c;是互联网基础设施的核心…...

AI 越狱技术剖析:原理、影响与防范

一、AI 越狱技术概述 AI 越狱是指通过特定技术手段&#xff0c;绕过人工智能模型&#xff08;尤其是大型语言模型&#xff09;的安全防护机制&#xff0c;使其生成通常被禁止的内容。这种行为类似于传统计算机系统中的“越狱”&#xff0c;旨在突破模型的限制&#xff0c;以实…...

项目进度延误的十大原因及应对方案

项目进度延误主要源于以下十大原因&#xff1a;目标不明确、需求频繁变更、资源配置不足或不合理、沟通不畅、风险管理不足、缺乏有效的项目监控、技术难题未及时解决、团队协作效率低下、决策链过长、外部因素影响。其中&#xff0c;需求频繁变更是导致延误的关键因素之一&…...

瑞友客户端登录GS_ERP时,报错: 由于安全许可证服务器不能提供许可证,连接被中断的解决方法

瑞友客户端登录GS_ERP时&#xff0c;报错&#xff1a;由于安全许可证服务器不能提供许可证&#xff0c;连接被中断的解决方法 瑞友客户端登录GS_ERP时&#xff0c; 报错&#xff1a;由于安全许可证服务器不能提供许可证&#xff0c;连接被中断的解决方法是由于远程桌面连接协议…...

android wifi通过命令行打开2.4G热点

android系统支持2G和5G&#xff0c;但车机系统应用只支持5G&#xff0c;但是需要测试2.4G的射频 方法如下&#xff1a; 1、adb shell 进去&#xff0c;su 指定root权限&#xff0c;确保热点处于关闭状态 2、开启热点为www99999, 密码为12345678&#xff0c; wpa2的加密协议 cm…...

truncate,drop,delete分析

truncate,drop,delete对比分析 特性 TRUNCATE DROP DELETE **操作对象** 表中的所有数据 整个表及其所有数据 表中的特定数据 **是否保留表结构** 是 否 是 **是否可恢复** 不可恢复 不可恢复 可恢复 **性能** 高 高 低&#xff08;逐行删除&#xff09; …...

vue+flask图书知识图谱推荐系统

文章结尾部分有CSDN官方提供的学长 联系方式名片 文章结尾部分有CSDN官方提供的学长 联系方式名片 关注B站&#xff0c;有好处&#xff01; 编号: F025 架构: vueflaskneo4jmysql 亮点&#xff1a;协同过滤推荐算法知识图谱可视化 支持爬取图书数据&#xff0c;数据超过万条&am…...

什么是微前端?有什么好处?有哪一些方案?

微前端&#xff08;Micro Frontends&#xff09; 微前端是一种架构理念&#xff0c;借鉴了微服务的思想&#xff0c;将一个大型的前端应用拆分为多个独立、自治的子应用&#xff0c;每个子应用可以由不同团队、使用不同技术栈独立开发和部署&#xff0c;最终聚合为一个整体产品…...