冒泡排序的核心逻辑是重复遍历数组,比较相邻元素并交换,使每轮最大(升序)或最小(降序)值“冒泡”至末尾;i 控制轮数,j 控制每轮比较范围,需注意边界条件。

冒泡排序的核心逻辑是什么
冒泡排序本质是重复遍历待排序数组,每次比较相邻两个元素,把较大(升序)或较小(降序)的那个“冒泡”到末尾。关键在于:每轮遍历后,未排序部分的极值会就位,所以下一轮可以少比较一次。
容易忽略的是边界控制——i 控制轮数,j 控制每轮比较范围,j 这个条件缺一不可,否则会越界或做无用比较。
标准 C++ 实现(含注释和测试)
以下代码使用 std::vector 和 size_t 类型,避免有符号/无符号混用警告;用引用传参避免拷贝;内层循环上限动态收缩。
#include#include void bubbleSort(std::vector
& arr) { size_t n = arr.size(); for (size_t i = 0; i < n - 1; ++i) { bool swapped = false; // 优化:提前终止 for (size_t j = 0; j < n - 1 - i; ++j) { if (arr[j] > arr[j + 1]) { std::swap(arr[j], arr[j + 1]); swapped = true; } } if (!swapped) break; // 没发生交换,说明已有序 } } int main() { std::vector
nums = {64, 34, 25, 12, 22, 11, 90}; bubbleSort(nums); for (int x : nums) std::cout << x << " "; std::cout << "\n"; return 0; }
常见错误与陷阱
写错下标、忘记优化、类型不匹配,是初学者最常踩的坑:
立即学习“C++免费学习笔记(深入)”;
j 或j → 数组越界访问arr[j+1]- 用
int i遍历size_t n→ 编译器警告,且当n == 0时i--变成极大正数 - 没加
swapped标志 → 即使输入已有序,仍执行全部O(n²)次比较 - 传值而非传引用 →
void bubbleSort(std::vector修改的是副本,原数组不变arr)
性能和适用场景提醒
冒泡排序时间复杂度恒为 O(n²)(最坏/平均),最好情况加优化后是 O(n);空间复杂度 O(1)。它只适合教学、极小数据(n )或几乎有序的特殊场景。
实际项目中,std::sort 是更优选择——底层是混合算法(introsort),平均 O(n log n),且经过高度优化。别为了“手写算法”在生产环境替换 std::sort。
真正要注意的,是理解为什么每轮能缩小范围,以及 swapped 标志如何改变最坏/最好情况的落差——这才是面试或调试时容易卡住的地方。











