冒泡排序是理解数组索引操作和元素交换逻辑的入门算法,核心为相邻比较与交换,通过双重for循环实现,外层控制轮数(length-1),内层控制每轮比较范围并防止i+1越界。

冒泡排序是理解数组索引操作和元素交换逻辑的绝佳入口。用Java原生代码手写它,不依赖任何工具类或高级语法,能让你真正看清“下标怎么动”“谁和谁在换”“边界为什么是这样”。
核心思想:相邻比较 + 位置交换
冒泡排序每次只看两个紧挨着的元素(比如 arr[i] 和 arr[i+1]),如果顺序不对(如升序时前者大于后者),就交换它们。这个过程像气泡往上冒——大的数不断往后挪,小的数逐渐往前浮。
关键不是“排序结果”,而是盯住:
- i 怎么变化?
- i+1 为什么不能越界?
- 为什么外层循环次数是 length - 1?
- 为什么内层每次可以少比一次?
手写步骤拆解(带注释的原生实现)
以下代码不用 ArrayList、不用 Collections、不用泛型封装,纯 int 数组 + for 循环 + 临时变量交换:
public static void bubbleSort(int[] arr) {
if (arr == null || arr.length <= 1) return;
<pre class='brush:java;toolbar:false;'>// 外层控制“冒泡轮数”:n个数最多需要 n-1 轮就能排定
for (int round = 0; round < arr.length - 1; round++) {
// 内层做实际比较和交换:每轮把当前未排序部分的最大值“冒”到末尾
// 每轮后末尾 round 个位置已有序,所以比较范围缩小为 length - 1 - round
for (int i = 0; i < arr.length - 1 - round; i++) {
if (arr[i] > arr[i + 1]) {
// 真正动手交换:用临时变量保存 arr[i],避免覆盖
int temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
// 此时你清晰看到:i 和 i+1 这两个下标上的值发生了互换
}
}
}}
立即学习“Java免费学习笔记(深入)”;
加深索引理解的三个观察点
- i 的取值范围决定谁和谁比:内层循环中 i 从 0 到 length−2−round,保证 i+1 始终合法(不会越界到 arr[length])
- 每轮后有效长度收缩:第 0 轮比全部 n−1 对;第 1 轮比前 n−2 对(因为最后一个已最大);第 round 轮只比前 n−1−round 对
-
交换动作暴露内存地址逻辑:
arr[i] = arr[i+1]是把右边值拷贝给左边;arr[i+1] = temp是把原来左边的值补回右边——这不是“整体移动”,而是两个独立赋值
验证索引行为的小技巧
在内层循环里加一句打印,直观看到下标和数值变化:
System.out.printf("第%d轮, 比较 arr[%d]=%d 和 arr[%d]=%d → ",
round, i, arr[i], i+1, arr[i+1]);
if (arr[i] > arr[i+1]) {
System.out.println("交换");
// ... 执行交换
} else {
System.out.println("不交换");
}
运行 int[] a = {5, 2, 8, 1};,你会清楚看见每一对比较的下标组合(0-1、1-2、2-3…),以及哪次触发了交换——这才是“理解索引”的实感。


















