冒泡排序嵌套for循环需外层i从0到n-2、内层j从0到n-2-i,避免越界;交换条件为arr[j] > arr[j+1]以实现大数后移;大数据应优先使用arrays.sort()。

for 循环嵌套怎么写才不越界
冒泡排序的嵌套 for 循环,最常错在内层循环边界上——多跑一轮,数组就 ArrayIndexOutOfBoundsException。外层控制轮数(最多 n-1 轮),内层负责每轮的相邻比较,它的上限必须随轮数递减。
- 外层
i从0到n-2(含),即i - 内层
j从0到n-2-i(含),即j ,不是固定 <code>arr.length-1 - 每轮结束后,最大元素已“冒”到末尾,后续无需再比它——这是剪枝关键,不是可选项
swap 操作为什么不能只写 arr[j] = arr[j+1]
只单向赋值会丢数据:把 arr[j+1] 覆盖到 arr[j] 后,arr[j] 的原始值就没了,没法完成交换。
- 必须用临时变量,或用异或(仅限整型且易读性差,不推荐)
- 常见错误写法:
arr[j] = arr[j+1]; arr[j+1] = arr[j];—— 第二步赋的是刚覆盖的值,等于没换 - 正确写法示例:
int temp = arr[j];<br>arr[j] = arr[j+1];<br>arr[j+1] = temp;
为什么升序排序要判断 arr[j] > arr[j+1]
符号方向直接决定排序方向,但容易凭直觉写反。冒泡的本质是“大数后移”,所以当前数比后面大时才交换,才能让大的逐渐沉到右端。
- 写成
会得到降序结果,逻辑没错但不符合“默认升序”的预期 - 如果业务需要降序,改符号即可,不必重写结构;但别混淆“交换条件”和“目标顺序”
- 注意:这和某些语言里
Comparator的compare()返回负数/正数含义不同,这里只是纯布尔判断
性能瓶颈在哪?什么时候该换算法
嵌套两层 for 导致时间复杂度固定为 O(n²),哪怕数组已经有序,基础版本仍会跑满 (n-1)+(n-2)+…+1 次比较。
- 加个
swapped标志位可提前退出:某轮没发生任何交换,说明已有序,立刻break - 但即便优化后,最坏/平均仍是
O(n²),大数据量(比如 >5000 元素)下明显卡顿 - 真要排序,优先用
Arrays.sort()(底层是双轴快排+归并混合),自己手写冒泡只适合教学或极小数据验证逻辑
嵌套循环的边界计算和交换原子性,是手写冒泡时最容易漏掉的两个点,一错就崩或结果错,没商量余地。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











