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

冒泡排序与选择排序完整对比解析

一、两种排序底层逻辑差异

1. 冒泡排序(课件抱西瓜案例)

生活比喻:每层电梯口放西瓜,每次只抱一个,上楼途中遇到更大西瓜就交换,一趟走完,最大西瓜会落到最末尾。

默认排序:从小到大升序
核心逻辑

  • 从头到尾相邻两个元素两两对比,顺序颠倒就交换;
  • 每一轮把无序区里最大元素移到无序区末尾

无序区间规则:第t趟待排序范围 [0, n-1-t],左边界固定下标 0,每一轮尾部收缩一格
操作特点:边比较边交换,单趟会产生多次交换;最多执行n-1趟即可完成整体排序

2. 选择排序(课件学生排队案例)

生活比喻:一群学生按身高从矮到高排队,每次找出当前人群里最矮的学生,直接和队伍首位交换。

默认排序:从小到大升序

核心逻辑

  • 完整遍历无序区找到最小值下标,遍历结束后统一交换;
  • 每一轮把无序区里最小元素移到无序区开头

无序区间规则:第t趟待排序范围 [t, n-1],右边界固定数组最后一位,每一轮头部收缩一格

• 操作特点:查找下标过程不交换元素,每一趟最多只执行 1 次交换;共需要n-1趟选择操作

3. 两种排序循环结构差异根源

冒泡每轮把最大值放到无序区末尾,选择每轮把最小值放到无序区开头,二者有序区生长位置、无序区间范围完全相反,原生循环代码不能直接互换套用。

仅理论上可以修改循环边界、遍历方向实现对方的放置效果,但学习、考试不建议仿写改造版本。

二、标准代码完整对照(C 语言)

(1)标准冒泡排序(升序,最大值移至无序区末尾)

// 外层循环:控制总排序趟数,最多n-1趟 for(t = 0 ; t < n-1;t++) { // 第t趟无序区间:[0, n-1-t) for(i = 0 ; i < n-1-t;i++) { // 相邻元素比较,前数大于后数则交换 if(a[i] > a[i+1]) { // 交换a[i]与a[i+1] int temp = a[i]; a[i] = a[i+1]; a[i+1] = temp; } } }

说明:

  1. 内层循环i最大取到n-2,若取n-1,i+1会超出数组下标发生越界;
  2. t=0无序区覆盖全部数组0~n-1,t=1无序区0~n-2,每轮尾部减少一位;
  3. 单趟循环结束,当前无序区最大值固定到尾部有序区。

(2)标准选择排序(升序,最小值移至无序区开头)

// 外层循环:共n-1趟选择 for(t = 0 ; t < n-1 ; t++) { // 先假设无序区第一个元素a[t]为最小值 int min = t; // 遍历剩余无序区 [t+1, n-1] for(i = t + 1 ; i < n;i++) { if(a[i] < a[min]) { min = i; // 更新最小值的下标 } } // 最小值不在无序区首位时,仅交换一次 if(min != t) { // 交换a[t] 和 最小值a[min] int temp = a[t]; a[t] = a[min]; a[min] = temp; } }

说明:

  1. 第t趟待排序无序区下标范围固定为[t, n-1];
  2. 内层循环只查找最小值下标,遍历全程不会交换任何元素;
  3. 内层循环走完后,最多执行一次交换,最小值固定到有序区末尾。

三、维度对比表格

对比维度标准冒泡排序标准选择排序
每轮核心操作将无序区最大值移到无序区末尾将无序区最小值移到无序区开头
有序区生成位置数组尾部数组头部
第 t 趟无序区间[0, n-1-t][t, n-1]
内层循环行为相邻两两比较,逆序立刻交换遍历查找最值下标,遍历中途不交换
交换特征一趟循环可发生多次交换每趟循环最多仅 1 次交换
原生循环能否直接互换不能,区间范围逻辑冲突不能,区间范围逻辑冲突

拓展知识点:升序改降序实现方式

两种排序仅修改比较判断符号,循环层数、区间、总趟数完全不变,不会增加循环步数,仅交换次数随原始数组有序度变化:
冒泡降序:if(a[i] > a[i+1]) → if(a[i] < a[i+1])
选择降序:定义max = t,判断改为if(a[i] > a[max])


核心疑惑解答(你之前全部疑问汇总)

疑惑 1:能不能互换两者原生循环思路写代码?


理论上可以修改循环边界、遍历方向实现对方效果,但不建议仿写改造版本。
原因:教材、考试只认标准原生代码;改造后可读性差,无性能提升,仅用来理解原理即可。


疑惑 2:改成从大到小排序,会多出循环步数吗?


不会。循环总趟数、内外层循环执行次数完全不变,只有交换次数会变化,循环步数不受升降序影响。


疑惑 3:为什么课件、教材全部用从小到大举例?


升序符合日常数字、生活排序习惯,理解门槛更低;
统一基准,方便横向对比两种排序的结构差异;
降序只是微小变形,只需改动一处判断,无需重头完整推演。


疑惑 4:所有排序算法都默认升序举例吗?


绝大多数基础排序、高级排序教学均以升序为主案例;降序仅作为课后拓展习题,不作为主线讲解内容。

http://www.jsqmd.com/news/1221348/

相关文章:

  • 爱彼中国官方售后服务中心|官方热线及全部网点地址权威信息公示(2026年7月更新) - 爱彼中国官方服务中心
  • 3分钟掌握缠论分析:通达信ChanlunX插件完全指南
  • STM32烧录方式全解析:从串口到SWD实战指南
  • ARM---基于I.MX6ULL的启动代码,汇编点灯,交叉编译以及对I.MX6ULL相关寄存器的介绍
  • 武汉别墅设计工作室怎么选?意米设计实话拆解高口碑高还原实力 - 品牌红黑榜
  • 基于SpringBoot的爱宠宠物寄养管理系统的设计
  • 8GB显存也能玩转AI视频生成!ComfyUI-FramePackWrapper让你在普通显卡上创作高清视频
  • 5个理由告诉你:为什么这款免费开源卡拉OK游戏值得你立即尝试
  • 基于SSM甜品蛋糕购物系统的设计
  • 如何用Python光学仿真解决复杂光子器件设计难题?RCWA项目完全解析
  • 2026滁州黄金回收正规商家:持有典当及回收双备案,合法合规经营 - 商业信息快查
  • Java基础(2)数据类型与变量
  • Windows本地部署Qwen2大模型|超详细步骤,附带全套避坑清单(新手零门槛)
  • 2026 合肥名表回收避雷手册:拒绝 “暴力开盖”,包河区易奢福无损检测让名表身价保值 - 奢侈品回收实体店
  • 2026年武汉硚口靠谱的卫生间旧房改造,哪家专业你知道吗? - 资讯纵览
  • 2026年7月最新雅典北京丰台大悦春风里维修保养服务电话 - 亨得利钟表维修中心
  • 多维聚合变形术:解决GROUP BY无法应对的分析错位问题
  • 光学仿真的终极武器:Python RCWA项目完全指南
  • BOM采购平台哪个好?企业如何快速完成电子元器件配单?
  • 2023最新指南:如何在Alpine Linux上部署Oracle Java8?docker-alpine-java完整教程
  • 力扣287-寻找重复数
  • SecretAgent API参考:掌握高效网页抓取的关键接口
  • 2026 合肥二手奢侈包行情看涨,包河区易奢福鉴定师支招:别清洗!原汁原味反而卖得高 - 奢侈品回收实体店
  • 2026泰州黄金回收避坑指南:认准这五家正规黄金回收商家 - 商业信息快查
  • 鸿蒙原生开发手记:徒步迹 - 健康数据展示页面
  • AI Agent 工程化实战:从原型到生产级智能体的完整路径
  • BepInEx深度解析:跨平台Unity插件框架架构设计与性能优化
  • 长沙芙蓉区文艺路街道亨得利官方名表服务中心电话公示(2026年7月最新) - 亨得利官方
  • 2026金华黄金回收全攻略:九大门店全覆盖,六大套路彻底拆解,本地变现优选 - 资讯纵览
  • 应收账款账期