新手小白学C语言——排序算法(冒泡、选择、插入)
目录一、引言二、三种基础排序方式1.冒泡排序1代码复现2代码演算3逻辑概括4应用场景2.选择排序1代码复现2代码演算3逻辑概括4应用场景3.插入排序1代码复现2代码演算3逻辑概括4应用场景三、对三种排序的总结与思考1、核心算法逻辑差异本质区别2、应用场景差异选型核心依据3、三者的相通之处与内在联系4、核心总结与思考四、编者的话一、引言排序算法作为一种常用的算法与我们生活的方方面面息息相关无论是做编程题还是解决具体生活场景中的问题排序都发挥着重要的作用。因此在C语言的学习中要重视排序算法的学习并将其灵活运用。二、三种基础排序方式1.冒泡排序1代码复现void Sort1(int arr[6]) { for (int i 0; i 6; i) { for (int j 0; j 6 - i - 1; j) { int temp; if (arr[j] arr[j 1]) { temp arr[j 1]; arr[j 1] arr[j]; arr[j] temp; } } } for (int i 0; i 6; i) { printf(%4d, arr[i]); } }2代码演算下面我们通过一组无序数列进行对冒泡排序的学习3 5 1 4 2 8我们先按照上述代码将这个无序数组进行排列i 0:(j:0--4) j 0: arr[j] 3 arr[j1] 5 //故if条件不成立不进行数字交换 j 1: arr[j] 5 arr[j1] 1 //if成立arr[j]和arr[j1]发生交换 j 2: arr[j] 5 arr[j1] 4 //if成立arr[j]和arr[j1]发生交换 j 3: arr[j] 5 arr[j1] 2 //if成立arr[j]和arr[j1]发生交换 j 4: arr[j] 5 arr[j1] 8 //故if条件不成立不进行数字交换因此经过第一大轮交换数组变为3 1 4 2 5 8 。i 1:(j:0--3) j 0: arr[j] 3 arr[j1] 1 //if成立arr[j]和arr[j1]发生交换 j 1: arr[j] 3 arr[j1] 4 //if条件不成立不进行数字交换 j 2: arr[j] 4 arr[j1] 2 //if成立arr[j]和arr[j1]发生交换 j 3: arr[j] 4 arr[j1] 5 //if条件不成立不进行数字交换因此经过第二大轮交换数组变为1 3 2 4 5 8 。i 2:(j:0--2) j 0: arr[j] 1 arr[j1] 3 //if条件不成立不进行数字交换 j 1: arr[j] 3 arr[j1] 2 //if成立arr[j]和arr[j1]发生交换 j 2: arr[j] 3 arr[j1] 4 //if条件不成立不进行数字交换因此经过第三大轮交换数组变为1 2 3 4 5 8 。其实可以发现到这里数组已经变成了有序数组那么后面 i 3 和 i 4的情况就不再继续阐述了原理与步骤同上述操作。3逻辑概括相邻元素两两比较逆序就交换每轮把最大未排序数“冒”到末尾重复至有序。4应用场景对小规模数据和接近有序的数组进行排序。2.选择排序1代码复现void Sort4(int arr[6]) { int Idx,i,j,temp; for(i 0;i 5;i) { Idx i; for(j i1;j 6;j) { if(arr[j] arr[Idx]) { Idx j; } } if(Idx ! i) { temp arr[i]; arr[i] arr[Idx]; arr[Idx] temp; } } for(int i 0;i 6;i) { printf(%4d,arr[i]); } }2代码演算我们依然通过这个无序数组按照代码进行演算3 5 1 4 2 8i 0:(Idx 0 j:1--5) j 1: arr[Idx] 3 arr[j] 5 //if不成立Idx不与j交换 j 2: arr[Idx] 3 arr[j] 1 //if成立Idx与j交换 j 3: arr[Idx} 1 arr[j] 4 //if不成立Idx不与j交换 j 4: arr[Idx} 1 arr[j] 2 //if不成立Idx不与j交换 j 5: arr[Idx} 1 arr[j] 8 //if不成立Idx不与j交换因此经过第一轮循环Idx变成了2故数组变为 1 5 3 4 2 8 。i 1:(Idx 1 j:2--5) j 2: arr[Idx] 5 arr[j] 3 //if成立Idx与j交换 j 3: arr[Idx] 3 arr[j] 4 //if不成立Idx不与j交换 j 4: arr[Idx] 3 arr[j] 2 //if成立Idx与j交换 j 5: arr[Idx] 2 arr[j] 8 //if不成立Idx不与j交换因此经过第二轮循环Idx变成了4故数组变为 1 2 3 4 5 8。i 2:(Idx 2 j:3--5) j 3: arr[Idx] 3 arr[j] 4 //if不成立Idx不与j交换 j 4: arr[Idx] 3 arr[j] 5 //if不成立Idx不与j交换 j 5: arr[Idx] 3 arr[j] 8 //if不成立Idx不与j交换因此我们发现第三轮循环已经没有交换出现了故后续i 3和i 4不再赘述。3逻辑概括每次从未排序区间选出最小值放到已排序区间末尾。4应用场景对数据量很小的数据进行排序。3.插入排序1代码复现void Sort2(int arr[6]) { for (int i 1; i 6; i) { if (arr[i] arr[i - 1]) { int temp arr[i]; int j; for (j i - 1; j 0(arr[j] temp); j--) { arr[j1] arr[j]; } arr[j1] temp; } } for (int i 0; i 6; i) { printf(%4d, arr[i]); } }2代码演算我们依然通过这个无序数组按照代码进行演算3 5 1 4 2 8下面进行推演3 5 1 4 2 8 i 0: 3 5 | 1 4 2 8 temp 1 □ 3 5 | 4 2 8 temp小于3 5 故3 5 都后移一位 1 3 5 4 2 8 i 1: 1 3 5 | 4 2 8 temp 4 1 3 □ 5 | 2 8 temp小于5 故5后移一位 1 3 4 5 2 8 i 2: 1 3 4 5 | 2 8 temp 2 1 □ 3 4 5 | 8 temp小于3 4 5 故3 4 5 都后移一位 1 2 3 4 5 8 i 3 此时arr[i] arr[i - 1]故排序结束3逻辑概括把未排序元素依次插入到前面有序序列的正确位置。4应用场景对数据量小和接近有序的数组进行排序。三、对三种排序的总结与思考冒泡、选择、插入是最基础的三种内部排序算法三者时间复杂度均为O(n²)属于简单暴力的排序算法核心均通过双层循环完成有序化但在核心逻辑、操作方式、性能特点和应用场景上存在显著差异同时底层设计又具备高度相通性以下从区别、场景、关联三方面整体总结。1、核心算法逻辑差异本质区别三者最核心的不同在于每轮排序的目标和操作方式完全不同1. 冒泡排序相邻交换倒逼极值归位通过相邻元素两两对比逆序则交换每一轮遍历都会将当前未排序区间的最大值“冒泡”到区间末尾通过多次交换逐步实现整体有序。核心是「边比较、边交换」交换次数最多。2. 选择排序先找极值定点归位全程遍历未排序区间先找出区间内的最小值最大值仅用一次交换将极值放到已排序区间末尾。核心是「多比较、少交换」比较次数多交换次数极少。3. 插入排序逐个插入构建有序区间默认数组前段为有序区间依次取出未排序区间的元素向前遍历插入到有序区间的对应正确位置。核心是「移位插入、逐步构建有序」无无效比较贴合有序数组特性。2、应用场景差异选型核心依据三者虽都不适合大规模乱序数据但根据自身性能特点适配场景各有侧重1. 冒泡排序仅适用于数据量极小、数组接近有序的场景优化版冒泡可提前终止循环效率最优主要用于算法入门教学实际项目极少使用交换开销过高。2. 选择排序适配交换操作成本极高的场景如复杂对象排序凭借最少的交换次数降低性能损耗不依赖数组有序度稳定性差适合小规模无序数据。3. 插入排序三者中实际可用性最高数据量小、数组基本有序时效率远超另外两者同时是唯一适配链表排序的算法也是高级排序快排、归并的底层优化辅助算法。3、三者的相通之处与内在联系1.复杂度与层级相通三者均为简单排序平均、最坏时间复杂度均为O(n²)空间复杂度均为O(1)属于原地排序无需额外开辟内存仅依靠原数组完成排序。2.排序思想同源均采用「分区间排序」思路将数组划分为已排序区间未排序区间通过多轮遍历不断缩小未排序区间、扩大已排序区间直至整体有序。3.迭代逻辑一致底层均依赖双层循环实现外层循环控制排序轮数确定已排序区间长度内层循环负责未排序区间的比较、交换或移位操作。4、核心总结与思考从算法优劣来看常规场景插入排序 选择排序 冒泡排序。冒泡排序冗余交换最多性能最差选择排序牺牲比较次数换取最少交换适配特殊场景插入排序利用数据有序性容错率最高、实用性最强。三种基础排序的设计体现了排序算法的核心优化思路从“盲目交换”冒泡到“减少无效交换”选择再到“利用已有有序性、减少无效遍历”插入是算法从粗糙到精细的迭代过程。同时三者的分区排序思想也是后续快速排序、归并排序等高效分治算法的基础逻辑雏形。此外三者的特性也印证了算法选型的核心原则没有最优算法只有最适配场景的算法需根据数据规模、有序程度、操作开销比较/交换灵活选择。四、编者的话小编作为安工大25级物联网工程学生学习三种基础排序让我收获很多。三者虽都是O(n²)算法但设计思路、适用场景差异明显也让我明白算法没有绝对好坏要结合硬件资源取舍其中插入排序更贴合物联网有序传感器数据处理需求。简单排序是高阶算法的基础代码细节直接影响嵌入式设备功耗与效率。希望以后能跟大家一起坚持手写推演吃透基础结合单片机实验落地代码同步刷题进阶分治、轻量化算法依托竞赛与大创项目把算法知识融入物联网软硬件开发实现自己的专业梦PS小编对算法类内容接触较少也是刚开始系统性学习这方面的知识如有不当请您批评指正小编将不尽感激谢谢您

相关新闻

华为OD机试真题 新系统 2026-07-12 C++ 实现【字符串压缩编码】

华为OD机试真题 新系统 2026-07-12 C++ 实现【字符串压缩编码】

目录 题目 思路 Code 题目 题目内容: 给定一个只包含大小写英文字母的字符串,请实现字符串压缩编码功能。 压缩规则如下: 如果字符连续出现次数大于 1,则用字符加上出现次数表示。 如果字符连续出现次数等于 1,则直接输出字符。 输入描述: 输入一行,包含一个…

2026/10/18 21:14:31 阅读更多 →
Maester与Microsoft Graph API集成:安全配置数据获取与分析指南 [特殊字符]️

Maester与Microsoft Graph API集成:安全配置数据获取与分析指南 [特殊字符]️

Maester与Microsoft Graph API集成:安全配置数据获取与分析指南 🛡️ 【免费下载链接】maester Maester is a test automation framework to help you stay in control of your Microsoft security configuration. 项目地址: https://gitcode.com/gh_m…

2026/10/18 21:15:16 阅读更多 →
HS2-HF Patch完整安装指南:5分钟实现Honey Select 2汉化去码终极方案

HS2-HF Patch完整安装指南:5分钟实现Honey Select 2汉化去码终极方案

HS2-HF Patch完整安装指南:5分钟实现Honey Select 2汉化去码终极方案 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF Patch是专为Honey Sele…

2026/10/16 23:21:22 阅读更多 →

最新新闻

【数字信号传输】模拟M-PAM和16-QAM数字传输系统(含SRRC脉冲整形、AWGN、BER分析、接收机优化和非线性放大器效应)【含Matlab源码 16092期】含报告

【数字信号传输】模拟M-PAM和16-QAM数字传输系统(含SRRC脉冲整形、AWGN、BER分析、接收机优化和非线性放大器效应)【含Matlab源码 16092期】含报告

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞…

2026/10/18 21:33:03 阅读更多 →
Markowitz与遗传算法双轨投资组合优化实战

Markowitz与遗传算法双轨投资组合优化实战

简介:本资源是一套面向量化投资与金融工程学习者的Python实战项目,聚焦投资组合优化核心方法——从经典Markowitz均值-方差模型到现代启发式算法(遗传算法)的完整实现与对比分析,适合具备基础Python编程能力及统计学知…

2026/10/18 21:33:03 阅读更多 →
【信道】双选择性信道中的FBMC-OQAM:MMSE均衡的新视角【含Matlab源码 16102期】

【信道】双选择性信道中的FBMC-OQAM:MMSE均衡的新视角【含Matlab源码 16102期】

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞…

2026/10/18 21:33:03 阅读更多 →
【信道估计】毫米波MIMO系统LS、OMP和SBL UPA远场信道估计(NMSE性能评估)【含Matlab源码 16091期】

【信道估计】毫米波MIMO系统LS、OMP和SBL UPA远场信道估计(NMSE性能评估)【含Matlab源码 16091期】

💥💥💥💥💥💥💥💥💞💞💞💞💞💞💞💞💞Matlab武动乾坤博客之家💞…

2026/10/18 21:33:03 阅读更多 →
Qwen3-TTS零样本音色克隆实战:从3秒参考音频到批量语音合成

Qwen3-TTS零样本音色克隆实战:从3秒参考音频到批量语音合成

简介:这份资源是面向语音合成初学者与开发者的Qwen3-TTS实战教程配套代码包,重点解决多语种语音生成中语速、音高、音色难以独立调节的问题。教程覆盖环境准备、快速部署到分步实践,并延伸至视频配音、有声书制作、智能客服等落地场景&#x…

2026/10/18 21:33:03 阅读更多 →
C++游戏开发实战:SDL2引擎下的超级玛丽复刻与实时系统训练

C++游戏开发实战:SDL2引擎下的超级玛丽复刻与实时系统训练

简介:这是一份基于C语言实现的经典横版闯关游戏——超级玛丽的完整源码工程,面向C初学者与面向对象编程实践者,适用于课程设计、游戏开发入门及OOP项目实训。资源包含可直接编译运行的Visual Studio 2008工程(.sln/.vcproj&#x…

2026/10/18 21:32:02 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →