正确冒泡排序需两层循环,内层上限为n-1-i防越界,用std::swap保类型安全,加swapped标志提前退出;模板版应支持迭代器和自定义比较,但实际项目应优先用std::sort。
冒泡排序在 C++ 里写起来很简单,但直接套模板容易出错——尤其边界条件、优化逻辑和类型安全这三块最容易翻车。
怎么写一个基础但正确的 bubble_sort 函数
核心是两层循环:外层控制轮数(最多 n-1 轮),内层做相邻比较与交换。关键点不是“能跑”,而是“不越界、不漏排”:
- 内层循环上限必须是
n - 1 - i(i是外层轮数),否则每轮都扫到底,浪费且可能访问arr[n] - 用
std::swap而不是手写交换,避免自赋值问题和类型不兼容(比如std::string) - 数组长度建议用
size_t或带符号类型明确处理,别混用int和size_t做减法,否则i > n时会绕成极大正数
示例:
void bubble_sort(std::vector& arr) {
size_t n = arr.size();
for (size_t i = 0; i < n - 1; ++i) {
for (size_t j = 0; j arr[j + 1]) {
std::swap(arr[j], arr[j + 1]);
}
}
}
}
怎么加提前退出优化(避免 O(n²) 变成真 O(n²))
冒泡排序的天然优势是「发现已有序时可提前结束」,但很多人加了 bool swapped 却忘了重置它:
立即学习“C++免费学习笔记(深入)”;
- 每轮开始前必须设
swapped = false,否则一次没换就永远不进下一轮 - 只在发生交换时才置
true,不能靠if外部变量判断 - 这个优化对几乎有序的数据效果明显,但对随机数据影响不大,别误以为它能“大幅提速”
改写片段: