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

C语言三大经典排序算法详解:快速排序、冒泡排序与选择排序

排序算法是计算机科学中最基础且核心的组成部分无论是数据处理、数据库查询还是算法竞赛高效的排序都是提升程序性能的关键。对于 C 语言初学者和开发者而言深入理解经典排序算法的原理与实现是夯实编程基础、培养算法思维的重要一步。本文将以 C 语言为载体详细剖析三种最经典、最常用的排序算法快速排序、冒泡排序和选择排序。我们将从算法思想、时间复杂度、稳定性等理论层面入手并结合清晰易懂的 C 语言代码实现逐步拆解每个算法的执行流程与关键细节。通过对比这三种算法的优缺点与适用场景希望能帮助读者建立起对排序算法的系统认知并能在实际编程中灵活运用。一、快速排序优点快排是不稳定排序但效率最高时间复杂度最好 / 平均O(n log n)最坏O(n²)思路选一个基准数把数组分成「比它小的」和「比它大的」两部分把基准数放到它最终的正确位置上对这两部分分别重复上面的操作直到所有数都排好序代码#includestdio.hintpartition(inta[],ints,intt){intis;intjt;inttmpa[i];while(i!j){// 只要左右指针没相遇就继续执行while(ijtmpa[j]){j--;// 从右往左找只要右边元素比基准大就将指针向左移动一个}a[i]a[j];// 如果右边元素比基准小将这个元素往前挪 i 的位置此时相当于这个元素位置是一个洞while(ijtmpa[i]){i;// 从左往右找如果左边元素比基准小左指针向后移动一个}a[j]a[i];// 将此时这个元素放到有洞的位置现在这个位置有洞}a[i]tmp;// 直到左右指针相遇此时有洞的位置就是基准应该在的正确位置returni;}voidquicksort(inta[],ints,intt){if(st){intipartition(a,s,t);quicksort(a,s,i-1);quicksort(a,i1,t);}}voidprintArray(inta[],intn){inti;for(i0;in;i){printf(%d ,a[i]);}}intmain(){inta[5]{5,3,8,4,2};intnsizeof(a)/sizeof(a[0]);printf(排序前:\n);printArray(a,n);printf(\n);printf(排序后:\n);quicksort(a,0,n-1);printArray(a,n);}注意点外层循环 while (i ! j)作用直到指针相遇才停止内层必须加 i j作用防止越界崩溃先从右往左扫 j再从左往右扫 i顺序不能反所有比较都用 tmp不要用 a[s]递归公式固定模板quicksort(a,s,i-1);quicksort(a,i1,t);递归出口 if (s t)不写会无限递归崩溃二、冒泡排序优点稳定复杂度最优O(n)平均、最坏O(n²)核心思路相邻两个元素两两比较逆序就交换每一轮遍历最大元素会逐步“冒泡”到末尾总共遍历数组长度 - 1 轮后续轮次只需比较未排序部分可优化某轮无交换说明已有序直接结束代码如下示例#includestdio.hvoidbubbleSort(inta[],intn){inti,j;intflag;for(i0;in-1;i){// 管跑了几轮每次循环过后最大的都已经在后面flag0;// 标记是否发生交换for(j0;jn-i-1;j){// 管每一轮都交换几次后面 n-i-1 个都已经排好了if(a[j]a[j1]){inttempa[j];a[j]a[j1];a[j1]temp;flag1;}}if(flag0){// 说明已经交换好了break;}}}voidprintArray(inta[],intn){inti;for(i0;in;i){printf(%d ,a[i]);}}intmain(){inta[5]{5,3,8,4,2};intnsizeof(a)/sizeof(a[0]);printf(排序前:\n);printArray(a,n);printf(\n);printf(排序后:\n);bubbleSort(a,n);printArray(a,n);}三、选择排序优点时间最优 / 平均 / 最坏 O(n²)空间O(1)稳定性不稳定思路每一轮在未排序区间找出最小值和区间首位元素交换逐步敲定有序部分。划分已排序、未排序两段遍历未排序区记录最小元素下标最小数换到未排序区开头重复操作全部元素归位代码#includestdio.hvoidselectSort(inta[],intn){inti,j,minindex;for(i0;in-1;i){// 有 n 个元素外面进行 n-1 次循环确定每次循环的起点minindexi;for(ji1;jn;j){// 内层循环找出最小数if(a[j]a[minindex]){minindexj;// 将最小下标找出来}}inttempa[i];a[i]a[minindex];a[minindex]temp;}}voidprintArray(inta[],intn){inti;for(i0;in;i){printf(%d ,a[i]);}}intmain(){inta[5]{5,3,8,4,2};intnsizeof(a)/sizeof(a[0]);printf(排序前:\n);printArray(a,n);printf(\n);printf(排序后:\n);selectSort(a,n);printArray(a,n);}总结本文详细介绍了 C 语言中三种经典的排序算法快速排序、冒泡排序和选择排序。快速排序以其分治思想著称平均时间复杂度为 O(n log n)是三者中效率最高的适用于大规模数据排序但需要注意其不稳定性和最坏情况下的性能退化。冒泡排序实现简单直观具有稳定性通过相邻元素比较和交换完成排序。虽然其平均和最坏时间复杂度为 O(n²)但在数据基本有序时通过优化可达到 O(n) 的最佳复杂度。选择排序同样简单通过不断选择未排序部分的最小元素进行交换。它不稳定且时间复杂度恒为 O(n²)但其空间复杂度低交换次数少在数据量小或对交换成本敏感的场景下有一定价值。掌握这三种基础排序算法不仅有助于理解更复杂的算法思想也是面试和笔试中的常见考点。建议读者在理解原理的基础上亲手实现代码并通过调试观察排序过程从而加深对算法本质的理解。
http://www.gsyq.cn/news/1373279.html

相关文章:

  • 李白的思乡诗 / 山水诗 / 豪放诗有哪些?诗词在线app手工整理
  • 四川型钢厂家现货批发|工程专用钢材一站式配送 - 四川盛世钢联营销中心
  • 别急着重装!Linux FTP登录报530错误的真正元凶,可能是这个不起眼的文件
  • 保姆级教程:用OpenCV和Python从零搭建双目测距系统(附完整代码与避坑指南)
  • WSL2终端颜值与效率双飞:保姆级oh-my-zsh配置指南(含autojump、语法高亮插件)
  • UE Mobility
  • 告别被动模式错误!手把手教你配置通信UOS的vsftpd,让Windows资源管理器也能顺畅访问
  • 你的Ubuntu软件源该换了!手把手教你为20.04/22.04配置国内镜像(阿里云/清华源)
  • 学生用户画像-考勤主题扩展标签构建实验报告
  • CentOS 7.9下Lustre 2.12.9集群部署避坑指南:从内核安装到客户端挂载的完整流程
  • Linux音频调试不求人:用amixer命令行精准控制音量与声道,解决‘有画面没声音’问题
  • 别再死记硬背了!通过一个成绩分析项目,彻底搞懂Linux静态库和共享库的区别
  • AI校园失物招领助手(实践团队总结)
  • 微软Fara1.5:开源浏览器智能体全面超越OpenAI和Google,27B小模型如何做到的?
  • 【脑机接口】迁移学习 域自适应 自监督 EEG 大模型术语解释(第9弹)
  • 长沙装修设计供应商
  • 2026年Q2智能安全头盔帽专业选型技术解析:交警执法记录仪/人员定位安全帽/单兵执法记录仪/安全生产检查记录仪/选择指南 - 优质品牌商家
  • 量子基准测试与PyQBench框架实践指南
  • C166开发中HEX文件生成问题解析与解决方案
  • 别再手动算卡路里了!用Python+OpenCV做个AI食物热量估算器(附完整代码)
  • Java 零基础核心知识点全网最全汇总,初学入门 面试复习必备
  • Kaggle新冠X光数据集处理实战:用Python脚本搞定80/20划分与掩码文件整理
  • 杭州做 GEO 优化推荐
  • 快拼箱采购避坑2026:工地活动板房、彩钢板房、彩钢活动房、折叠箱房、拓展箱房、移动活动板房、箱式活动房、网红箱选择指南 - 优质品牌商家
  • 饲料颗粒机生产厂家
  • Node.js 服务端项目集成 Taotoken 多模型 API 的实践
  • 2026年当下广东省冰花漆采购指南:聚焦云勋新材料科技有限公司 - 2026年企业推荐榜
  • 洛谷p1419
  • 关于我 博主介绍 代码获取说明
  • Linux内核开发避坑指南:workqueue工作队列实战,共享队列和自定义队列怎么选?