冒泡排序需确保内层循环边界为j arr[j + 1],否则易致越界或不稳定;升序稳定版必须用>而非>=,降序则用

冒泡排序在 C++ 里用双重 for 循环就能写出来,但新手常写成死循环、越界访问,或根本排不成功——问题大多出在内层循环边界和交换条件上。
为什么 i 而不是 i ?
i ?外层循环控制“轮数”,每轮把当前未排序部分的最大值“冒”到末尾。n 个元素最多需要 n−1 轮就可完成排序(最后一轮只剩一个元素,无需比较)。若写成 i ,最后一轮会做无意义的空循环,虽不报错但效率低;更危险的是,若内层循环没同步收缩范围,可能引发越界。
- 正确写法:
for (int i = 0; i - 错误典型:
for (int i = 0; i (多跑一轮,且易导致内层j 下溢)
for (int j = 0; j 中的 n - i - 1 怎么来的?
n - i - 1 怎么来的?每轮结束后,末尾 i+1 个位置已有序(第 0 轮后最大值到位,第 1 轮后次大值到位……)。所以第 i 轮只需比较前 n - i 个元素,而相邻比较需索引 j 和 j+1 都有效,因此 j 最大只能取到 n - i - 2,即 j 。
- 若写成
j :当j == n - i - 1时,arr[j+1]就是arr[n - i],越界 - 若写成
j :每轮都扫全数组,不仅重复比较已排序部分,还会在后期必然越界
交换逻辑必须用 arr[j] > arr[j + 1],不能反着写
冒泡排序默认升序,核心是“前大后小则交换”。若写成 ,就会变成降序;若漏掉等号(比如写成 >=),遇到相等元素时仍交换,破坏稳定性(相同值的相对顺序会变)——虽然对纯数值影响小,但一旦元素是自定义结构体,稳定性就很重要。
立即学习“C++免费学习笔记(深入)”;
- 升序稳定版:用
if (arr[j] > arr[j + 1]) - 降序:用
if (arr[j] - 别用
>=,除非你明确要非稳定排序
完整可运行示例(带注释)
#include#include using namespace std; void bubbleSort(vector
& arr) { int n = arr.size(); for (int i = 0; i < n - 1; ++i) { // 外层:共 n-1 轮 for (int j = 0; j < n - i - 1; ++j) { // 内层:每轮少比 1 个 if (arr[j] > arr[j + 1]) { // 升序,前大于后才交换 swap(arr[j], arr[j + 1]); } } } } int main() { vector
a = {64, 34, 25, 12, 22, 11, 90}; bubbleSort(a); for (int x : a) cout << x << " "; // 输出:11 12 22 25 34 64 90 }
真正容易被忽略的不是怎么写,而是每次改循环边界时是否同步检查了数组访问下标——哪怕只多加一个 1 或少减一个 1,都可能让程序在小数据上正常、大数据上崩溃。









