电话
400 9058 355
冒泡排序的核心逻辑是重复遍历数组,比较相邻元素并交换,使每轮最大(升序)或最小(降序)值“冒泡”至末尾;i 控制轮数,j 控制每轮比较范围,需注意边界条件。
冒泡排序本质是重复遍历待排序数组,每次比较相邻两个元素,把较大(升序)或较小(降序)的那个“冒泡”到末尾。关键在于:每轮遍历后,未排序部分的极值会就位,所以下一轮可以少比较一次。
容易忽略的是边界控制——i 控制轮数,j 控制每轮比较范围,j 这个条件缺一不可,否则会越界或做无用比较。
以下代码使用 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; }
写错下标、忘记优化、类型不匹配,是初学者最常踩的坑:
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 标志如何改变最坏/最好情况的落差——这才是面试或调试时容易卡住的地方。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...