新手小白学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/7/21 19:19:48 阅读更多 →
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/7/21 16:39:55 阅读更多 →
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/7/22 15:19:06 阅读更多 →

最新新闻

AO3镜像站终极指南:3步免费畅游全球最大同人创作平台 [特殊字符]

AO3镜像站终极指南:3步免费畅游全球最大同人创作平台 [特殊字符]

AO3镜像站终极指南:3步免费畅游全球最大同人创作平台 🚀 【免费下载链接】AO3-Mirror-Site 项目地址: https://gitcode.com/gh_mirrors/ao/AO3-Mirror-Site 还在为无法访问Archive of Our Own(AO3)而烦恼吗?AO…

2026/7/24 16:40:00 阅读更多 →
马斯克2026奇点论与能量货币的技术解析

马斯克2026奇点论与能量货币的技术解析

1. 前沿科技思想解析:从奇点到能量货币 最近科技圈最热的话题莫过于埃隆马斯克在最新访谈中提出的两大颠覆性观点——"2026奇点论"和"能量货币论"。作为长期关注科技前沿的从业者,我认为这两个概念不仅代表了当前技术发展的风向标&a…

2026/7/24 16:40:00 阅读更多 →
Unity后处理实现赛博朋克风格Spine动画外发光技术详解

Unity后处理实现赛博朋克风格Spine动画外发光技术详解

1. 项目概述:当Spine动画遇见赛博朋克在2D游戏开发中,Spine动画以其流畅的骨骼动画和高效的资源管理,成为了角色、UI动效的宠儿。但很多时候,我们总感觉Spine动画的视觉表现力还差那么一口气——它精致、灵活,却少了些…

2026/7/24 16:40:00 阅读更多 →
怎么检测你调的 API 是不是被偷换成了蒸馏/低配模型(附可复现脚本)

怎么检测你调的 API 是不是被偷换成了蒸馏/低配模型(附可复现脚本)

不要再用"你是谁"来验证了问模型"你是什么模型"是最没用的方法——只要在 system prompt 里写一句"你是 GPT-5.6",任何模型都会照着答。有效的检测都基于一个原则:问身份可以伪造,但行为特征很难伪造。 下面四…

2026/7/24 16:40:00 阅读更多 →
MoE架构解析:如何提升大模型计算效率与性能

MoE架构解析:如何提升大模型计算效率与性能

1. MoE架构的本质:为什么它能让大模型更聪明?MoE(Mixture of Experts)不是凭空出现的新概念,它的核心思想可以追溯到1991年的论文《Adaptive Mixture of Local Experts》。但直到Transformer时代,这个技术才…

2026/7/24 16:39:59 阅读更多 →
Windows PDF处理终极指南:5分钟掌握Poppler-Windows完整安装与使用

Windows PDF处理终极指南:5分钟掌握Poppler-Windows完整安装与使用

Windows PDF处理终极指南:5分钟掌握Poppler-Windows完整安装与使用 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 还在为Windows系统上…

2026/7/24 16:38:59 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻