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

【补阙拾遗】排序之冒泡、插入、选择排序

炉烟爇尽寒灰重,剔出真金一寸明

  • 冒泡排序
      • 1. 轻量化情境导入 🌌
      • 2. 边界明确的目标声明 🎯
      • 3. 模块化知识呈现 🧩
        • 📊 双循环结构对比表★★★
        • ⚠️ 代码关键点注释
      • 4. 嵌入式应用示范 🛠️
      • 5. 敏捷化巩固反馈 ✅
  • 插入排序
      • 1.轻量化情境导入
      • 2.边界明确的目标声明
      • 3. 模块化知识呈现★★★
      • 4. 敏捷化巩固反馈
  • 选择排序】
      • 1. 轻量化情境导入
      • 2. 边界明确的目标声明
      • 3. 模块化知识呈现★
      • 4. 嵌入式应用示范 ★★★
  • 结语


冒泡排序

1. 轻量化情境导入 🌌

🔍 冷知识触点
公元前200年的埃及书记官整理莎草纸时,会按厚度分组排列——这可能是人类最早的无意识排序应用。就像把不同大小的尼罗河石子按顺序摆放,现代编程中的冒泡排序延续了这种「让无序变有序」的思维本能。


2. 边界明确的目标声明 🎯

📌 知识层级标注

核心概念(必会)兴趣拓展(自主选择)
冒泡排序基本原理自适应冒泡优化逻辑

💡 功能说明
通过分析代码中的is_swap标记,理解提前终止机制如何将最差时间复杂度从O(n²)优化到O(n)


3. 模块化知识呈现 🧩

📊 双循环结构对比表★★★
循环类型作用域关键操作视觉化比喻
外层循环控制排序轮数每轮缩小检测范围收网的渔夫
内层循环执行元素比较相邻元素交换气泡上浮
⚠️ 代码关键点注释
void bubble_sort(int* arr, int n) {// 外层循环控制排序轮次,n个元素最多需要n-1轮排序// 每完成一轮,右侧有序区增加一个元素for(int i = 0; i < n - 1; ++i) {bool is_swap = false;  // 本趟交换标志位(优化关键点)// 内层循环进行相邻元素比较,边界控制要点:// 1. 比较范围:j ∈ [0, n-i-1)// 2. 每轮处理左侧未排序区:n - i - 1 表示://    - n-i:排除已排序的i个元素//    - -1:防止j+1越界for(int j = 0; j < n - i - 1; ++j) {// 核心操作:前>后时交换(保持稳定性)if(arr[j] > arr[j + 1]) {  // 使用标准库交换函数,等价于:// int temp = arr[j];// arr[j] = arr[j+1];// arr[j+1] = temp;swap(arr[j], arr[j + 1]);is_swap = true;  // 标记发生交换}}// 优化点:如果本轮无交换,说明数组已完全有序// 提前终止排序过程,减少不必要的比较if(!is_swap) break;// 此时数组 arr[n-i-1] 位置已存放正确元素// 即第i大的元素已归位到数组末尾}
}

4. 嵌入式应用示范 🛠️

🔧 微型案例解析
对数组[5,3,7,2]执行代码:

  1. 第一轮外层循环(i=0):
    • 比较3-7(不换)、7-2(交换)→ [5,3,2,7]
    • is_swap=true
  2. 第二轮外层循环(i=1):
    • 比较3-2(交换)→ [5,2,3,7]
  3. 优化触发:第三轮无交换→提前终止

5. 敏捷化巩固反馈 ✅

✏️ 诊断性检测
判断正误:

  1. 冒泡排序必须完整执行n-1轮外层循环(❌)
  2. 交换标记能提升有序数组的排序效率(√)
  3. 内层循环比较次数随轮数增加而增加(❌)

🎯 动态调节建议
若错选第3题,补充讲解:内层循环范围由n-i-1控制,比较次数递减


插入排序

1.轻量化情境导入

📜 趣味触点:古埃及图书馆的"卷轴排序法"
考古发现古埃及图书馆管理员会用"渐进整理法"管理莎草纸卷轴:每次拿到新卷轴时,都会从右向左对比现有卷轴编号,找到合适位置插入。这被认为是人类最早的插入排序实践!

2.边界明确的目标声明

核心概念(必会):
• 插入排序的基本操作步骤
• 时间复杂度分析(最好/最坏情况)
• 算法稳定性理解

3. 模块化知识呈现★★★

🕒 时间轴图解

[未排序] → 取元素 → 向前比较 → 移位腾空 → 插入定位 → [部分有序]  

🔍 ​关键代码段全景注释​(完整代码+认知锚点)

void insert_sort(int* arr, int n) {// 🌟 外层循环:控制待插入元素的范围(从第2个到最后一个)for(int i=1; i<n; i++) {  // 🚩 i就像发牌员,每次抽一张新牌// 🔑 记忆锚点1:key是被选中的待插入元素int key = arr[i];     // 把当前元素暂存,如同抽出的扑克牌握在手中// 🎯 探针指针:指向已排序区的最后一个元素int j = i-1;          // 从有序区末尾开始向左探测(如同整理书架时从右往左找位置)// 🔄 核心操作:移位腾出插入空间// 🚨 注意双条件:防止越界 且 持续查找插入点while((j >= 0) && (key < arr[j])) { // 📦 元素右移:为key腾出空间(像推箱子游戏中的滑动操作)arr[j+1] = arr[j]; // 把较大元素向右移动一格j--;               // 探针左移继续比较(如同在书架上向左移动寻找合适位置)}// 💡 插入操作:找到最终插入位置(j+1是腾出的空位)arr[j+1] = key;  // 将暂存的key放入正确位置(像把扑克牌插入牌堆)}
}

4. 敏捷化巩固反馈

诊断性判断题

  1. 插入排序适合百万级数据排序(×)
  2. 当输入已排序时时间复杂度最优(√)
  3. 算法需要额外O(n)存储空间(×)

2分钟快问快答
Q1:元素移动的平均次数是多少?
A:约n²/4次
Q2:为什么说它是稳定排序?
A:相等元素不会跨位交换
Q3:为什么插入排序在近乎有序数据中表现极佳?​
A:此时while循环几乎不执行,时间复杂度趋近O(n)(如同整理已经基本有序的书架)
Q4:如何直观理解空间复杂度O(1)?
A:所有操作在原数组完成,如同在固定桌面上理牌无需额外桌子(仅用key暂存一个元素)
Q6:为什么说插入排序是希尔排序的基础?
A:希尔排序本质是分组插入排序,通过调整gap值突破O(n²)瓶颈


选择排序】

1. 轻量化情境导入

🎮 趣味触点:想象你要整理书架上的漫画书(数学中的极值查找,就像每次找出最薄的那本放到最左边,重复这个过程直到全部有序。这正是选择排序的核心思想——每次遍历找出最小值并归位。

2. 边界明确的目标声明

🎯 核心概念(必会):
▸ 算法执行步骤分解
▸ 时间复杂度计算

3. 模块化知识呈现★

📊 全流程可视化分解表(核心操作追踪)

迭代轮次操作区间关键步骤分解数组状态变化示例比较次数交换次数
初始[0,5]原始无序数组🔴5 🟢3 🟠1 🟣4 ⚪200
第1轮[0,4] → [0,5]1. 定位最小值索引min_idx=2
2. 交换arr[0]与arr[2]
🟠1 🟢3 🔴5 🟣4 ⚪241
第2轮[1,4] → [1,5]1. 定位最小值索引min_dix=4
2. 交换arr[1]与arr[4]
🟠1 ⚪2 🔴5 🟣4 🟢331
第3轮[2,4] → [2,5]1. 定位最小值索引min_idx=4
2. 交换arr[2]与arr[4]
🟠1 ⚪2 🟢3 🟣4 🔴521
第4轮[3,4] → [3,5]1. 定位最小值索引min_idx=3
2. 无交换(已就位)
🟠1 ⚪2 🟢3 🟣4 🔴510

符号说明

  • 🔴🟢🟠🟣⚪:不同元素的跟踪标识
  • 加粗索引:当前轮次确定的最小值最终位置

4. 嵌入式应用示范 ★★★

📝 代码注释加强版

void selection_sort(int* arr, int n) {for (int i=0; i<n-1;i++) {         // 🚩 每次确定一个最小元素int min_idx = i;                   // 🔍 初始化最小值索引for (int j = i + 1; j < n; j++)if (arr[j] < arr[min_idx])     // ⚖️ 比较次数:Σ(n-i)min_idx = j;               // 🎯 更新最小值坐标swap(arr[min_idx], arr[i]);        // 🔄 每轮仅1次交换}
}

🎯 认知脚手架:记住口诀"找最小,往前放,循环往复序自成"

  1. 敏捷化巩固反馈
    ✏️ 诊断题
    ▸ 选择排序在最好情况下的时间复杂度是?(O(n²))
    ▸ 对数组[5,5,3]排序是否稳定?(否)

🚀 快问快答


Q1: 为什么外层循环终止条件是 i < n-1 而不是 i < n
A1: 当 i = n-2 时,剩余未排序区间仅剩最后一个元素,无需再处理。若写成 i < n 会导致内层循环出现 j = n 的无效遍历(数组越界)。


Q2: 内层循环中 min_idx = i 的意义是什么?
A2: 初始化最小值索引为当前未排序区间的起始位置 i。若直接设为 0,会导致从数组头部开始搜索,破坏未排序区间的独立性。


Q3: 为什么每次外层循环只做一次交换?
A3: 选择排序的核心逻辑是 “定位最小值 → 单次交换”,这保证了每轮仅需一次交换操作(时间复杂度O(n)),而冒泡排序可能需要多次相邻交换(时间复杂度O(n²))。


Q4: 对数组 [5, 1, 5] 排序是否稳定?解释原因
A4: ❌ 不稳定!第一个 5 会和 1 交换,导致两个 5 的相对顺序反转。关键代码:跳跃式交换(swap(arr[min_idx], arr[i]))破坏了稳定性。


Q5: 若数组已完全有序,时间复杂度是多少?
A5: 仍是 O(n²)!选择排序无法提前终止,必须完整执行所有比较(固定比较次数为 n(n-1)/2)。


Q6: 以下代码会导致什么问题?

for (int j = i; j < n; j++) {  // ❌ j起始点错误if (arr[j] < arr[min]) min = j;
}

A6: 内层循环应从 i+1 开始。若从 i 开始,会多一次无意义的 arr[i] 与自身的比较(不影响结果,但浪费计算资源)。


结语

当索尔抡起雷霆之锤砸向无序的巨人骨骸,迸发的火花恰似冒泡排序在数据深渊中倔强翻涌的气泡——每一轮循环都带着阿斯加德工匠的憨直,明知要遍历九界却仍将最大值如米德加德之蛇般拖拽至末端。

插入排序是芙蕾雅颈间的布里辛嘉曼,将每一颗新获的珍珠嵌入早已温热的链隙,纵使奥丁的乌鸦嘶喊着“O(n²)”,她依旧用指尖的寒霜在混沌中刺出优雅的裂隙,毕竟诸神黄昏前的小规模战阵,何需动用海姆达尔的O(n log n)号角?

选择排序则泄露了洛基的狡黠:他扮作伊瓦尔迪的侏儒,假意虔诚地献上“每次选取最小值”的忠贞,却在暗处嗤笑那些被循环囚禁的勇士——“看呐!这些坚持双重复仇的维京蛮子,宁可让时间平方级燃烧也要亲手确认每一粒数据尘埃的重量!”

但九大世界的真相是:当矮人克瓦希尔酿造的蜜酒尚未填满耶梦加德的胃囊时,那些被嘲笑的O(n²)勇士仍在幽暗的锻炉旁闪耀——它们用布吉拉之骨般朴素的比较与交换,铸成了所有高阶魔法赖以攀附的青铜地基。冰川纪的慢,何尝不是一种对绝对秩序的偏执朝圣?

相关文章:

【补阙拾遗】排序之冒泡、插入、选择排序

炉烟爇尽寒灰重&#xff0c;剔出真金一寸明 冒泡排序1. 轻量化情境导入 &#x1f30c;2. 边界明确的目标声明 &#x1f3af;3. 模块化知识呈现 &#x1f9e9;&#x1f4ca; 双循环结构对比表★★★⚠️ 代码关键点注释 4. 嵌入式应用示范 &#x1f6e0;️5. 敏捷化巩固反馈 ✅ …...

跨AWS账户共享SQS队列以实现消息传递

在现代分布式系统中,不同的服务和组件通常需要进行通信和协作。Amazon Simple Queue Service (SQS)提供了一种可靠、可扩展且完全托管的消息队列服务,可以帮助您构建分布式应用程序。本文将介绍如何在一个AWS账户(账户A)中创建SQS队列,并授权另一个AWS账户(账户B)中的用户和角色…...

基于Python实现的【机器学习】小项目教程案例

以下是一个基于Python实现的【机器学习】小项目教程案例,结合的经典案例与最佳实践,涵盖数据预处理、模型训练与评估全流程,并附详细代码说明与结果分析: 案例1:鸢尾花分类(SVM算法) 数据集:Iris Dataset(含150个样本,4个特征,3个类别) 目标:根据花瓣与萼片长度…...

TDengine 中的数据库

数据库概念 时序数据库 TDengine 中数据库概念&#xff0c;等同于关系型数据库 MYSQL PostgreSQL 中的数据库&#xff0c;都是对资源进行分割管理的单位。 TDengine 数据库与关系型数据库最大区别是跨库操作&#xff0c;TDengine 数据库跨库操作除了少量几个SQL 能支持外&…...

.Net Core Visual Studio NuGet.Config 配置参考

Visual Studio 2022 NUGET NU1301 无法加载源 基础连接已关闭&#xff1a;无法建立SSL / TLS安全通道的信任关系&#xff1b;根据验证过程&#xff0c;远程证书无效&#xff0c;参考文章&#xff1a;https://blog.csdn.net/hefeng_aspnet/article/details/145780081 NuGet 行为…...

深入剖析 OpenCV:全面掌握基础操作、图像处理算法与特征匹配

深入剖析 OpenCV&#xff1a;全面掌握基础操作、图像处理算法与特征匹配 一、引言二、OpenCV 的安装&#xff08;一&#xff09;使用 pip 安装&#xff08;二&#xff09;使用 Anaconda 安装 三、OpenCV 基础操作&#xff08;一&#xff09;图像的读取、显示与保存&#xff08;…...

帧率和带宽

帧率&#xff0c;通常指的是每秒传输的帧数&#xff0c;帧就是一段数据包。 带宽则是指在单位时间内可以传输的数据量&#xff0c;通常以比特每秒来衡量 帧率在ROS2中可能指的是每秒发布的消息数量。也就是说&#xff0c;一个节点发布话题的频率。比如&#xff0c;每秒发布10次…...

Immich自托管服务的本地化部署与随时随地安全便捷在线访问数据

文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 小伙伴们&#xff0c;你们好呀&#xff01;今天要给大家揭秘一个超炫的技能——如何把自家电脑变成私人云相册&#xff0c;并…...

20250212:ZLKMedia 推流

1:资料 快速开始 ZLMediaKit/ZLMediaKit Wiki GitHub GitHub - ZLMediaKit/ZLMediaKit: WebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT server and client framework based on C++11 文档里面提供了各个系…...

IDEA中.gitignore未忽略指定文件的问题排查与解决

IDEA 中.gitignore 未忽略.env 文件的问题排查与解决 在使用 IntelliJ IDEA 进行项目开发时,合理利用.gitignore文件来管理版本控制是非常重要的。它能帮助我们排除一些不需要纳入版本管理的文件,比如包含敏感信息的.env文件。然而,有时我们会遇到一种情况:明明已经将.env…...

Apache-iotdb 基本概念

问题背景 定义&#xff08;写得太好了&#xff01;&#xff09; root 是整个树状结构的父节点&#xff0c; CirroData-TimeS 有存储组、设备、测点等概念&#xff0c;数据在存储的时候&#xff0c;不同的存储组的数据是存储在不同的文件夹中的。上图中有 root.sgcc、root.ln两…...

CryptoJS库中WordArray对象支持哪些输出格式?除了toString() 方法还有什么方法可以输出吗?WordArray对象的作用是什么?

前言&#xff1a;这里只说js用的CryptoJS库里的相关内容&#xff0c;只用js来进行代码操作和讲解。 这里网上相关的帖子很少&#xff0c;不得已问了很长时间AI 想引用CryptoJS库情况分两种&#xff0c;一种是html引用&#xff0c;另一种是在Nodejs里引用。 一、引用CryptoJS库…...

Java 面试题 20250227

Java 中序列化与反序列化是什么&#xff1f; 序列化&#xff1a;将 Java 对象转化成可传输的字节序列格式&#xff08;字节流、JSON、XML&#xff09;&#xff0c;以便于传输和存储。 反序列化&#xff1a;将字节序列格式数据转化成 Java 对象的过程。 1、为什么需要序列化和…...

springboot浅析

springboot浅析 什么是springboot&#xff1f; 实际上springboot就是一个给我们提供了快速搭建使用spring的一种方式&#xff0c;让我们省去了繁琐的xml配置。 为什么无需进行大量的xml配置&#xff0c;就是因为springboot是基于约定优于配置的思想&#xff0c;简单来说就是遵循…...

【文件基础操作】小笔记

Step1: 现在项目文件夹&#xff08;我的项目叫做RunPony&#xff09;下创建一个a.txt文本文件&#xff0c;手动写入一些数字&#xff0c;保存 Step2: 现在在main.c内写一个基本的文件处理的程序 Step3: 现在已经知道如何打开关闭文件&#xff0c;下一步要搞懂如何读取txt内的…...

SSL 证书是 SSL 协议实现安全通信的必要组成部分

SSL证书和SSL/TLS协议有着密切的关系&#xff0c;但它们本质上是不同的概念。下面是两者的区别和它们之间的关系的表格&#xff1a; 属性SSL/TLS 协议SSL证书英文全称SSL&#xff08;Secure Sockets Layer&#xff09;&#xff0c;TLS&#xff08;Transport Layer Security&am…...

AI问答-供应链管理:排队模型M/D/5/100/m/FCFS代表的含义是什么

在供应链管理中&#xff0c;排队模型M/D/5/100/m/FCFS代表的含义如下&#xff1a; M&#xff1a; 表示顾客到达时间间隔服从负指数分布&#xff08;Markov&#xff0c;负指数分布具有无记忆性&#xff09;&#xff0c;即顾客到达是随机的&#xff0c;且到达时间间隔服从指数分…...

迁移学习策略全景解析:从理论到产业落地的技术跃迁

&#xff08;2025年最新技术实践指南&#xff09; 一、迁移学习的范式革命与核心价值 在人工智能进入"大模型时代"的今天&#xff0c;迁移学习已成为突破数据瓶颈、降低训练成本的关键技术。本文基于2025年最新技术进展&#xff0c;系统梳理六大核心策略及其在产业实…...

Linux驱动学习(四)--字符设备注册

上一节讲到的字符设备注册与销毁是通过cdev_init、cdev_add、cdev_del等函数分步执行的&#xff0c;本小节用一种更简单的方式&#xff0c;来注册字符设备 register_chrdev 如果major为0&#xff0c;该函数将动态的分配一个主设备号并且返回对应的值如果major > 0&#xff…...

30天开发操作系统 第24天 -- 窗口操作

一、窗口切换 1.0 前天开始我们的应用程序可以显示自己的窗口了&#xff0c;现在画面上到处都是窗口&#xff0c;我们急需能够 切换窗口顺序的功能&#xff0c;使得在需要的时候可以查 看最下面的窗口的内容。这个功能看起来不难&#xff0c;我们马上来实现它。 不过&#xf…...

Visual Studio 中 C/C++ 函数不安全警告(C4996)终极解决方案:分场景实战指南

问题描述 在 Visual Studio 中编写 C/C 代码时&#xff0c;使用 scanf、strcpy、fopen 等传统函数会触发以下警告&#xff1a; C4996: xxx: This function or variable may be unsafe. Consider using xxx_s instead. 根本原因&#xff1a; 这些函数缺乏缓冲区溢出检查&#…...

【Go】十八、http 调用服务的编写

http接口框架的搭建 这个http接口框架的搭建参考之前的全量搭建&#xff0c;这里是快速搭建的模式&#xff1a; 直接对已有的http模块进行复制修改&#xff0c;主要修改点在于 proto部分与api、router 部分&#xff0c;剩余的要针对进行修改模块名称。 接口的具体编写 在 a…...

提升数据洞察力:五款报表软件助力企业智能决策

概述 随着数据量的激增和企业对决策支持需求的提升&#xff0c;报表软件已经成为现代企业管理中不可或缺的工具。这些软件能够帮助企业高效处理数据、生成报告&#xff0c;并将数据可视化&#xff0c;从而推动更智能的决策过程。 1. 山海鲸报表 概述&#xff1a; 山海鲸报表…...

Materials Studio MS2020在linux系统上的安装包下载地址 支持centos Ubuntu rocky等系统

下载地址&#xff1a;MS2020-linux官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘 Materials Studio 2020是一款功能强大的材料科学计算模拟软件&#xff0c;以下是其详细介绍&#xff1a; 核心模块功能 CASTEP模块&#xff1a;采用平面波赝势方法&#xff0c;适用于周…...

ASP.NET MVC AJAX 文件上传

在ASP.NET MVC中实现文件上传功能&#xff0c;特别是在使用AJAX时&#xff0c;可以通过多种方式完成。以下是实现文件上传的几种常用方法&#xff0c;包括使用jQuery和原生AJAX。 方法1&#xff1a;使用jQuery的AJAX方法 1. 创建视图&#xff08;View&#xff09; 首先&#x…...

3.17 AI Agent 场景革命:解锁企业级应用的 15 个黄金赛道

AI Agent 场景革命:解锁企业级应用的 15 个黄金赛道 关键词:AI Agent 应用场景, 企业级智能体案例, 多模态 Agent 实现, 工具链自动化, 智能决策系统 1. 企业级 Agent 场景分类图谱 #mermaid-svg-UjUmmToEKigfdlFf {font-family:"trebuchet ms",verdana,arial,san…...

阿里云服务器宝塔终端如何创建fastadmin插件

1. 进入宝塔终端 2. cd / 进入根目录 3. FastAdmin 可以通过命令行创建一个插件&#xff0c;首先我们将工作目录切换到我们的项目根目录&#xff0c;也就是think文件所在的目录。 cd /var/www/yoursite/ 4.然后我们在命令行输入 php think addon -a mydemo -c create …...

待完成-swig将c语言程序转为python可用示例

待完成-swig将c语言程序转为python可用示例 deepseek 使用 SWIG&#xff08;Simplified Wrapper and Interface Generator&#xff09;可以将 C 语言程序库连接为 Python 可用的模块。以下是基本步骤&#xff1a; 1. 安装 SWIG 首先&#xff0c;确保你已经安装了 SWIG。你可以…...

【语音编解码】常用的基于神经网络的语音编解码方案对比

引言 随着实时通信与多媒体应用的爆炸式增长&#xff0c;传统语音编解码技术正面临带宽效率与音质保真的双重挑战。近年来&#xff0c;基于深度学习的神经编解码器突破性地将端到端架构、动态码率控制与可解释信号处理相结合&#xff0c;在3kbps以下超低码率场景仍能保持自然语…...

DeepSeek行业应用实践报告-智灵动力【112页PPT全】

DeepSeek&#xff08;深度搜索&#xff09;近期引发广泛关注并成为众多企业/开发者争相接入的现象&#xff0c;主要源于其在技术突破、市场需求适配性及生态建设等方面的综合优势。以下是关键原因分析&#xff1a; 一、技术核心优势 开源与低成本 DeepSeek基于开源架构&#xf…...