C++ 怎么实现冒泡排序 C++ 双重循环排序算法逻辑详解【新手】
技术百科
穿越時空
发布时间:2026-01-27
浏览: 次 冒泡排序需确保内层循环边界为j arr[j + 1],否则易致越界或不稳定;升序稳定版必须用>而非>=,降序则用
冒泡排序在 C++ 里用双重 for 循环就能写出来,但新手常写成死循环、越界访问,或根本排不成功——问题大多出在内层循环边界和交换条件上。
为什么 i 而不是 i ?
i ?外层循环控制“轮数”,每轮把当前未排序部分的最大值“冒”到末尾。n 个元素最多需要 n−1 轮就可完成排序(最后一轮只剩一个元素,无需比较)。若写成 
- 正确写法:
for (int i = 0; i - 错误典型:
for (int i = 0; i (多跑一轮,且易导致内层j 下溢)
for (int j = 0; j 中的 n - i - 1 怎么来的?
n - i - 1 怎么来的?每轮结束后,末尾 i+1 个位置已有序(第 0 轮后最大值到位,第 1 轮后次大值到位……)。所以第 i 轮只需比较前 n - i 个元素,而相邻比较需索引 j 和 j+1 都有效,因此 j 最大只能取到 n - i - 2,即 j 。
- 若写成
j :当j == n - i - 1时,arr[j+1]就是arr[n - i],越界 - 若写成
j :每轮都扫全数组,不仅重复比较已排序部分,还会在后期必然越界
交换逻辑必须用 arr[j] > arr[j + 1],不能反着写
冒泡排序默认升序,核心是“前大后小则交换”。若写成 ,就会变成降序;若漏掉等号(比如写成 >=),遇到相等元素时仍交换,破坏稳定性(相同值的相对顺序会变)——虽然对纯数值影响小,但一旦元素是自定义结构体,稳定性就很重要。
- 升序稳定版:用
if (arr[j] > arr[j + 1]) - 降序:用
if (arr[j] - 别用
>=,除非你明确要非稳定排序
完整可运行示例(带注释)
#include#include using namespace std; void bubbleSort(vector
& arr) { int n = arr.size(); for (int i = 0; i < n - 1; ++i) { // 外层:共 n-1 轮 for (int j = 0; j < n - i - 1; ++j) { // 内层:每轮少比 1 个 if (arr[j] > arr[j + 1]) { // 升序,前大于后才交换 swap(arr[j], arr[j + 1]); } } } } int main() { vector
a = {64, 34, 25, 12, 22, 11, 90}; bubbleSort(a); for (int x : a) cout << x << " "; // 输出:11 12 22 25 34 64 90 }
真正容易被忽略的不是怎么写,而是每次改循环边界时是否同步检查了数组访问下标——哪怕只多加一个 1 或少减一个 1,都可能让程序在小数据上正常、大数据上崩溃。
# ai
# 的是
# 就会
# 就能
# 能让
# 还会
# 大数据
# 最多
# 只需
# 排序算法
# 循环
# c++
# if
# int
# stream
# 为什么
# 结构体
# 算法
# ios
# for
# 稳定版
# 升序
# 降序
# 冒泡排序
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 手机php文件怎么变成mp4_安卓苹果打开php转
- Windows怎样关闭开始菜单广告_Windows
- php嵌入式多设备通信怎么实现_php同时管理多个
- Windows怎样关闭桌面弹窗广告_Windows
- 如何在Golang中引入测试模块_Golang测试
- mac怎么安装adb_MAC配置Android A
- Win11如何添加/删除输入法 Win11切换中英
- Win11如何关闭游戏模式 Win11禁用Xbox
- Mac如何开启夜览模式_Mac护眼模式设置与定时
- MySQL 中使用 IF 和 CASE 实现查询字
- LINUX下如何配置VLAN虚拟局域网_在LINU
- Win10怎样卸载TeamViewer_Win10
- Win11怎么查看已连接wifi密码 Win11查
- 如何使用Golang管理跨项目依赖_Golang多
- Win11怎么退出高对比度模式_Win11取消反色
- Python对象比较排序规则_集合使用说明【指导】
- 如何使用Golang sync.Map实现并发安全
- 如何使用Golang实现基本类型比较_Golang
- 如何使用正则表达式提取以编号开头、后跟多个注解的完
- 如何在Golang中实现基础配置管理功能_Gola
- Bpmn 2.0的XML文件怎么画流程图
- php串口通信波特率怎么选_根据硬件手册设置正确波
- c++中如何计算坐标系中两点间距离_c++勾股定理
- Win11怎么开启窗口对齐助手_Windows11
- 如何将文本文件中的竖排字符串转换为横排字符串
- Win11怎么开启剪贴板历史记录_Windows1
- Win11怎么清理C盘系统错误报告_Win11清理
- C++如何使用std::transform批量处理
- PHP的Workerman对架构扩展有啥帮助_应用
- php8.4如何调用com组件_php8.4win
- Win11怎么设置按流量计费_Win11限制后台流
- Win11时间怎么同步到原子钟 Win11高精度时
- 如何使用Golang管理模块版本_Golanggo
- Mac如何设置动态壁纸?(让桌面动起来)
- Win10系统怎么查看端口状态_Windows10
- 如何使用Golang模拟请求超时_Golang c
- php怎么连接数据库_MySQL数据库连接的基础代
- 如何在 Windows 11 中使用 AlomWa
- VSC怎么创建PHP项目_从零开始搭建项目的步骤【
- Go 语言标准库为何不提供泛型 Contains
- Win11怎么设置开机密码_Windows11账户
- 如何使用Golang处理静态文件缓存_提高页面加载
- Win11怎么更改计算机名_Windows11系统
- Python文件管理规范_工程实践说明【指导】
- php和redis连接超时怎么办_phpredis
- 如何使用 Python 合并文件夹内多个 Exce
- Win11怎么格式化U盘_Win11系统U盘格式化
- php怎么下载安装后设置默认字符集_utf8配置步
- Win11怎么关闭任务栏小图标_Windows11
- Python与OpenAI接口集成实战_生成式AI

QQ客服