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