冒泡排序需两层循环:外层控制n−1轮,内层每轮缩小范围至n−i−1;关键在相邻比较与交换,配合打印调试可快速定位索引与逻辑错误。

用 Java 的 if-else 和 for/while 写排序,不是为了替代 Arrays.sort(),而是练透“什么时候该比、怎么换、循环边界在哪”这些底层逻辑。
冒泡排序:理解“相邻比较 + 多轮扫描”的控制流
冒泡的核心是每轮把最大(或最小)元素“浮”到末尾。关键不在交换本身,而在两层循环的分工:
- 外层循环控制“轮数”,共需 n−1 轮(最后一轮只剩一个元素,无需再比)
- 内层循环控制“本轮比较范围”,每轮后末尾已有序,所以范围逐步缩小:for (int j = 0; j
- 比较 arr[j] 和 arr[j+1],满足条件就 swap —— 这里必须用临时变量,直接赋值会丢数据
选择排序:抓住“找极值 + 一次交换”的确定性逻辑
它不追求每轮都“冒泡”,而是每轮只做一件事:在未排序部分找到最小值,和当前位置交换。逻辑更线性,但交换次数最少(最多 n−1 次):
- 外层 i 从 0 到 n−2,代表当前要确定第 i 个位置的值
- 内层 j 从 i+1 到 n−1,在剩余部分找最小值下标
- 找到后只 swap(arr[i], arr[minIndex]) —— 注意不是每次比较都交换
插入排序:模拟“打牌理牌”的渐进式思维
把数组看成两部分:左边已排好序(初始只有第一个),右边待处理。每轮取一个新元素,像插进手牌一样,把它放到左边合适的位置:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
- 外层 i 从 1 开始(第 0 个默认有序),取 arr[i] 为待插入元素
- 内层用 while 从 i−1 往前扫:只要 arr[j] > key,就 arr[j+1] = arr[j](腾位置)
- 退出循环时 j+1 就是 key 的最终位置,执行 arr[j+1] = key
调试建议:加打印比盲跑更高效
初学排序容易卡在索引越界或逻辑颠倒。不妨在关键位置加简单输出:
- 每轮外循环开始时打印 "Round i: " + Arrays.toString(arr)
- 每次交换前打印 "swap " + j + " and " + (j+1)
- 用小数组测试(如 {5, 2, 8, 1}),手动推演和程序输出对照,很快定位哪一步出错
写一遍冒泡,改两行变选择,再调结构成插入——不是复制粘贴,而是边改边问“这里为什么能换?i 和 j 的意义变了吗?” 逻辑就立住了。


















