如何用冒泡排序算法实现代码练习?

2026-05-07 18:421阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计805个文字,预计阅读时间需要4分钟。

如何用冒泡排序算法实现代码练习?

很多人写的冒泡排序跑了一轮就停了,或者多跑一轮导致越界,问题出在内外层循环的终止条件上。

控制轮数,变量j控制每轮比较的范围,每轮结束后,最大元素冒到末尾,下一轮比较范围要减一。

  • i0n-1(共 n 轮,但实际最多 n-1 轮就能排好)
  • j0n-2-i,不是 n-1-i —— 因为要访问 arr[j+1],所以 j+1 < nj < n-1
  • 如果用 for (int j = 0; j < n - 1 - i; j++),边界刚好卡住不越界

为什么 swap 后不加 break 就不是“优化版”冒泡

标准冒泡每轮都扫到底;所谓“优化”是指提前发现已有序时直接退出。但很多人只加了 if (swapped == false) break;,却忘了重置 swapped 标志位——结果第二轮就失效了。

  • 必须在每轮开始前设 bool swapped = false;
  • 只有 swap 发生时才置为 true
  • 常见错误:把 swapped 声明在循环外,或漏掉赋初值
  • 这个优化对完全逆序数组没用,但对基本有序数据能显著减少比较次数

vector<int> 和 int[] 在实现时要注意什么

std::vector 写更安全,但新手常忽略 .size() 返回 size_t(无符号),和 int 混算会导致隐式转换问题,尤其在 n-1-iiint 时可能变成极大正数。

  • 推荐统一用 size_t i = 0;,或强转:static_cast<int>(vec.size())
  • 数组传参时,int arr[] 实际退化为指针,必须额外传 size,不能用 sizeof(arr)/sizeof(arr[0])
  • vector 可直接用 .size(),且支持 at() 做边界检查(调试时有用)

运行时崩溃或结果错乱的典型错误现象

EXC_BAD_ACCESS 或输出乱码,大概率是数组越界;结果部分有序、末尾元素错位,往往是内层循环少减了 1。

立即学习“C++免费学习笔记(深入)”;

  • 错误写法:for (int j = 0; j < n - i; j++) → 访问 arr[j+1] 时越界
  • 错误写法:for (int i = 0; i < n; i++) + j < n - i → 第一轮 j 最大为 n-1j+1 就越界
  • gdbAddressSanitizer 能快速定位越界位置,比肉眼查快得多

边界计算看着简单,但 nij 三者关系稍一松动就出事,手写时最好先在纸上画两轮索引变化再敲代码。

标签:C

本文共计805个文字,预计阅读时间需要4分钟。

如何用冒泡排序算法实现代码练习?

很多人写的冒泡排序跑了一轮就停了,或者多跑一轮导致越界,问题出在内外层循环的终止条件上。

控制轮数,变量j控制每轮比较的范围,每轮结束后,最大元素冒到末尾,下一轮比较范围要减一。

  • i0n-1(共 n 轮,但实际最多 n-1 轮就能排好)
  • j0n-2-i,不是 n-1-i —— 因为要访问 arr[j+1],所以 j+1 < nj < n-1
  • 如果用 for (int j = 0; j < n - 1 - i; j++),边界刚好卡住不越界

为什么 swap 后不加 break 就不是“优化版”冒泡

标准冒泡每轮都扫到底;所谓“优化”是指提前发现已有序时直接退出。但很多人只加了 if (swapped == false) break;,却忘了重置 swapped 标志位——结果第二轮就失效了。

  • 必须在每轮开始前设 bool swapped = false;
  • 只有 swap 发生时才置为 true
  • 常见错误:把 swapped 声明在循环外,或漏掉赋初值
  • 这个优化对完全逆序数组没用,但对基本有序数据能显著减少比较次数

vector<int> 和 int[] 在实现时要注意什么

std::vector 写更安全,但新手常忽略 .size() 返回 size_t(无符号),和 int 混算会导致隐式转换问题,尤其在 n-1-iiint 时可能变成极大正数。

  • 推荐统一用 size_t i = 0;,或强转:static_cast<int>(vec.size())
  • 数组传参时,int arr[] 实际退化为指针,必须额外传 size,不能用 sizeof(arr)/sizeof(arr[0])
  • vector 可直接用 .size(),且支持 at() 做边界检查(调试时有用)

运行时崩溃或结果错乱的典型错误现象

EXC_BAD_ACCESS 或输出乱码,大概率是数组越界;结果部分有序、末尾元素错位,往往是内层循环少减了 1。

立即学习“C++免费学习笔记(深入)”;

  • 错误写法:for (int j = 0; j < n - i; j++) → 访问 arr[j+1] 时越界
  • 错误写法:for (int i = 0; i < n; i++) + j < n - i → 第一轮 j 最大为 n-1j+1 就越界
  • gdbAddressSanitizer 能快速定位越界位置,比肉眼查快得多

边界计算看着简单,但 nij 三者关系稍一松动就出事,手写时最好先在纸上画两轮索引变化再敲代码。

标签:C