冒泡排序核心是“比较—交换—收缩边界—提前终止”思维,通过两层循环实现相邻元素比较与交换,每轮将最值归位并缩小内层范围,加swapped标志可优化至o(n),升序降序仅需调整比较符号。

冒泡排序是理解算法逻辑的起点,不是为了在生产环境用它排序,而是为了掌握“比较—交换—收缩边界—提前终止”这一底层思维模式。大厂面试常考手写,重点不在背代码,而在讲清每一步为什么这么设计。
核心逻辑:两层循环 + 相邻比较
外层控制轮数,内层负责逐对比较。每轮结束,未排序部分的最大(或最小)元素就归位到一端,所以内层比较范围要逐步缩小:
- 第0轮:比较索引 0↔1、1↔2 … (n−2)↔(n−1),共 n−1 次
- 第1轮:比较到 n−2 就停,因为末尾已有序,只需比前 n−1 个元素
- 第 i 轮:内层循环上限设为 n − i − 1,避免越界也避免无效比较
关键优化:用布尔标记提前退出
如果某一轮从头到尾都没发生交换,说明数组已经有序,后续轮次纯属浪费。加一个 swapped 标志即可拦截:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 每轮开始前设 swapped = false
- 只要发生一次交换,就置为 true
- 本轮结束若仍是 false,直接 break 外层循环
- 最好情况(已排序)时间复杂度从 O(n²) 降到 O(n)
升序与降序:只改一个比较符号
升序是 arr[j] > arr[j+1] 时交换;降序只需改成 arr[j] 。不需要重写整套逻辑,也不用传额外方向参数——把比较逻辑抽成函数接口,才是更工程化的做法,但手写题中一行条件切换足矣。
完整可运行示例(含注释)
// 直接复制进 Main.java 即可编译运行
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length
int n = arr.length;
for (int i = 0; i
boolean swapped = false;
for (int j = 0; j
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
if (!swapped) break;
}
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










