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

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

  • 冒泡排序
      • 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²)勇士仍在幽暗的锻炉旁闪耀——它们用布吉拉之骨般朴素的比较与交换,铸成了所有高阶魔法赖以攀附的青铜地基。冰川纪的慢,何尝不是一种对绝对秩序的偏执朝圣?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/25249.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python的那些事第三十四篇:基于 Plotly 的交互式图表与仪表板设计与应用

基于 Plotly 的交互式图表与仪表板设计与应用 摘要: 本文深入探讨了 Plotly 这一强大的交互式图表和仪表板库。首先介绍了 Plotly 的背景与发展历程,随后详细阐述了其核心功能特性,包括丰富的图表类型、高度的自定义能力以及便捷的交互操作。通过实际案例分析和示例代码展示…

英文论文查重,Turnitin和IThenticate两个系统哪个更合适?

Turnitin系统和IThenticate系统都是检测英文论文的查重系统&#xff0c;但是两者之间还是有一些不一样的。 下面针对这两个系统给大家具体分析一下。 一、Turnitin系统 Turnitin检测系统&#xff1a; https://truth-turnitin.similarity-check.com Turnitin是世界上主流的…

[Linux]项目自动化构建工具-make/Makefile

项目自动化构建工具-make/Makefile make与Makefile单文件Makefile多文件Makefile 缓冲区 首先理清多文件之间的关系&#xff1a; 这里为什么没有包含test.h头文件&#xff1f;因为在当前工作目录下&#xff0c;因此不需要包含test.h&#xff0c;如果把test.h移到上一级目录&…

ArcGIS Pro中打造精美高程渲染图的全面指南

一、引言 高程渲染图是地理信息系统&#xff08;GIS&#xff09;中用于展示地形地貌的重要工具。一张精美的高程渲染图&#xff0c;不仅能够清晰地呈现地形的起伏变化&#xff0c;还能增强视觉表现力&#xff0c;使得数据更加生动、直观。ArcGIS Pro作为一款强大的GIS软件&…

ollama本地部署DeepSeek(Window图文说明)

目录 1. ollama下载2. 环境变量3. deepseek下载4. 彩蛋 1. ollama下载 安装包下载&#xff1a;Window安装包 命令行方式安装&#xff1a;&#xff08;不推荐使用exe方式进行安装&#xff0c;默认会在C盘路径下&#xff09; 点击install之后&#xff1a; 2. 环境变量 先配…

sqlilab 46 关(布尔、时间盲注)

sqlilabs 46关&#xff08;布尔、时间盲注&#xff09; 46关有变化了&#xff0c;需要我们输入sort&#xff0c;那我们就从sort1开始 递增测试&#xff1a; 发现测试到sort4就出现报错&#xff1a; 我们查看源码&#xff1a; 从图中可看出&#xff1a;用户输入的sort值被用于查…

【02】Cocos游戏开发引擎从0开发一款游戏-cocos项目目录结构熟悉-调试运行项目-最重要的assets资源文件认识-场景sense了解-优雅草卓伊凡

【02】Cocos游戏开发引擎从0开发一款游戏-cocos项目目录结构熟悉-调试运行项目-最重要的assets资源文件认识-场景sense了解-优雅草卓伊凡 开发背景 接下来我们直接打开我们的项目开始进一步操作&#xff0c; 实战开发 导入项目 我把得到的项目解压到本地&#xff0c;我们开…

spring结合mybatis多租户实现单库分表

实现单库分表 思路&#xff1a;student表数据量大&#xff0c;所以将其进行分表处理。一共有三个分表&#xff0c;分别是student0&#xff0c;student1&#xff0c;student2&#xff0c;在新增数据的时候&#xff0c;根据请求头中的meta-tenant参数决定数据存在哪张表表。 数…

数据结构:Top-K问题详解

一.Top-K问题 #include<stdio.h> //先自主创建n个数据 void CreateNDate() {// 造数据int n 100000;srand(time(0));//表示随时间初始化随机生成数的种子const char* file "data.txt";///创建一个文件FILE* fin fopen(file, "w");//“只写”写入创…

基于 Flink CDC YAML 的 MySQL 到 Kafka 流式数据集成

本教程的演示都将在 Flink CDC CLI 中进行&#xff0c;无需一行 Java/Scala 代码&#xff0c;也无需安装 IDE。 这篇教程将展示如何基于 Flink CDC YAML 快速构建 MySQL 到 Kafka 的 Streaming ELT 作业&#xff0c;包含整库同步、表结构变更同步演示和关键参数介绍。 准备阶段…

AI绘画软件Stable Diffusion详解教程(3):Windows系统本地化部署操作方法(通用版)

上一篇教程介绍了如何在本地部署Stable Diffusion专业版&#xff0c;虽然便于技术人员研究&#xff0c;但是普通人使用起来不便捷&#xff0c;每次只能通过cmd窗口的指令形式或者python代码方式来画图&#xff0c;要记很多的指令很繁琐。 本篇教程教您搭建webui版的&#xff0…

进程 ─── linux第10课

目录 回顾上一节 进程 基本概念 描述进程 - PCB task_struct - PCB的一种 task_ struct内容分类 组织进程 下面来介绍task_struct内部 PID 和PPID 子进程与父进程 getpid()和getppid() 杀进程 exe 和 cwd 回顾上一节 1. 如果我们写的程序要访问硬件,必定通过sy…

量子计算的数学基础:复数、矩阵和线性代数

量子计算是基于量子力学原理的一种新型计算模式,它与经典计算机在信息处理的方式上有着根本性的区别。在量子计算中,信息的最小单位是量子比特(qubit),而不是传统计算中的比特。量子比特的状态是通过量子力学中的数学工具来描述的,因此,理解量子计算的数学基础对于深入学…

PostgreSQL_安装部署

一、Windows系统下安装 1.下载安装包 登录PostgreSQL: Downloads官网&#xff1a; 选择14.12版本&#xff0c;点击下载&#xff1a; 2.安装PostgrSQL14.12 双击exe安装包程序&#xff0c;准备安装&#xff1a; 选择安装路径&#xff1a; 选择想安装的工具&#xff1a; 选择数…

Idea 和 Pycharm 快捷键

一、快捷键 二、Pycharm 中怎么切换分支 参考如下 如果在界面右下角 没有看到当前所在的分支&#xff0c;如 “Git:master” 3. 有了 4.

第十四届蓝桥杯:DFS之飞机降落

这道题&#xff0c;由于它的数据范围是非常小的&#xff0c;我们可以采取暴力搜索的措施&#xff0c;把每种情况都枚举出来&#xff0c;如果有能行的情况就返回true 同时我们也要学会剪枝&#xff0c;如果已经确认飞机不能降落&#xff0c;就不要往下再展开了 #include <i…

Oracle 查询表空间使用情况及收缩数据文件

本文介绍Oracle收缩数据文件的相关操作&#xff0c;运维工作中有时会需要通过收缩数据文件来释放磁盘空间。 数据文件初始化方式&#xff1a; 1.我们创建表空间一般有两种方式初始化其数据文件&#xff0c;即指定初始大小为32G&#xff08;很大的值&#xff09;或指定初始大小为…

android 新增native binder service 方式(一)

关于之前说的native service 之前有写过类似的文章&#xff0c;今天主要介绍下如何通过binder 方式跨进程调用和回调,结合网上的各种文章&#xff0c;总结了3种常见的添加方式&#xff0c;供大家参考。 一&#xff0c;aidl 文件定义 先看下整体的目录结构 libserviceaidl 就是…

【大模型系列篇】大模型微调工具 LLama-Factory、Unsloth、ms-SWIFT

今日号外&#xff1a;&#x1f525;&#x1f525;&#x1f525; DeepSeek团队正式启动为期五天的开源计划 Day3&#xff1a;DeepGEMM。DeepGEMM 是一个专为简洁高效的 FP8 通用矩阵乘法&#xff08;GEMM&#xff09;设计的库&#xff0c;具有细粒度缩放功能&#xff0c;如 Deep…

安宝特科技 | Vuzix Z100智能眼镜+AugmentOS:重新定义AI可穿戴设备的未来——从操作系统到硬件生态,如何掀起无感智能革命?

一、AugmentOS&#xff1a;AI可穿戴的“操作系统革命” 2025年2月3日&#xff0c;Vuzix与AI人机交互团队Mentra联合推出的AugmentOS&#xff0c;被业内视为智能眼镜领域的“iOS时刻”。这款全球首个专为智能眼镜设计的通用操作系统&#xff0c;通过三大突破重新定义了AI可穿戴…