冒泡排序需控制内层循环边界为length-i-1以避免越界,外层执行n-1轮;升序用arr[j]>arr[j+1],降序则相反;仅适用于教学或受限环境,工程中应使用Arrays.sort()。

冒泡排序怎么写才不会越界
Java里手写冒泡排序,最常遇到的错误是数组下标越界,报 ArrayIndexOutOfBoundsException。根本原因是内层循环边界没控好——拿 i 当右边界时,j+1 很容易踩到数组末尾外面。
正确做法是:外层控制轮数(最多 n-1 轮),内层只遍历到 length - i - 1,保证 j+1 始终合法。
- 别用
for (int j = 0; j —— 必崩 - 正确写法:
for (int j = 0; j - 如果数组长度为 0 或 1,直接 return,避免空指针或无效循环
升序和降序只差一个符号,但逻辑不能反
很多人改升降序时只改比较符,结果排出来是乱的。关键不在 还是 <code>>,而在「交换条件」是否和目标一致:升序要让大数往后沉,所以当前数 > 后一个数时交换;降序则相反。
错例:if (arr[j] 配合升序目标 → 实际排成降序
立即学习“Java免费学习笔记(深入)”;
- 升序:用
if (arr[j] > arr[j + 1]) - 降序:用
if (arr[j] - 别把条件写成
arr[j + 1] > arr[j]再套升序逻辑——语义绕,易出错
为什么不用 Arrays.sort()?什么场景真得手写
Arrays.sort() 是优化过的双轴快排(对 int 是归并+快排混合),性能远超冒泡。手写冒泡唯一合理场景是教学、调试理解排序过程,或者嵌入式/极简环境连标准库都受限。
实际工程中硬上冒泡,会付出明显代价:
- 时间复杂度固定
O(n²),1000 个数就要百万级比较 - 没有稳定优化(比如提前终止),哪怕数组已有序,仍跑满
n-1轮 - Java 中
int[]是基本类型数组,无法用泛型抽象,换类型就得重写
一个能直接粘贴运行的干净版本
下面这段代码去掉注释后可直接编译运行,处理边界、支持升序、无冗余逻辑:
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length <= 1) return;
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
注意:这个版本没加「已有序提前退出」优化。不是因为它不重要,而是加了之后判断逻辑和交换逻辑耦合变强,初学反而容易漏掉某处的 break 或状态重置——先跑通再优化,比一上来就堆细节更可靠。


















