c++中如何进行冒泡排序_c++冒泡排序代码实现
发布时间 - 2026-01-07 00:00:00 点击率:次冒泡排序核心是外层n-1轮遍历、内层每轮比较前n-i-1对相邻元素并交换,用std::swap和vector模板实现更安全;避免裸数组因长度退化导致越界,且不可用于生产环境。
冒泡排序的核心逻辑怎么写
冒泡排序本质是重复遍历数组,每次比较相邻两个元素,把较大(升序时)的“冒泡”到末尾。关键不是嵌套循环本身,而是边界控制和交换条件。
常见错误是内层循环上限写成 size 而非 size - i - 1,导致已排好序的末尾元素被反复比较甚至越界访问
。
- 外层循环控制轮数,共
n-1轮即可;第i轮后末尾i个元素已就位 - 内层循环只需比较前
n - i - 1对相邻元素,避免冗余和越界 - 使用
std::swap()比手写临时变量更安全、可读性更好
标准 C++ 实现(含 vector 支持)
用 std::vector 替代裸数组更符合现代 C++ 习惯,也避免手动传长度。注意函数模板能自动适配不同数值类型。
templatevoid bubble_sort(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 - i - 1; ++j) { if (arr[j] > arr[j + 1]) { std::swap(arr[j], arr[j + 1]); swapped = true; } } if (!swapped) break; // 提前退出优化 } }
为什么不用 raw array 写通用函数
对 int arr[5] 这类原始数组,无法直接推导长度(sizeof(arr) 在函数参数中退化为指针),必须额外传 size_t n。这容易出错且不安全:
- 调用者可能传错长度,导致越界读写
- 无法对
std::array或std::vector复用同一接口 -
std::vector的.data()和.size()已封装好底层细节
所以优先用 std::vector& 或带长度的模板(如 template),但后者仅限编译期确定大小的数组。
性能与实际使用提醒
冒泡排序时间复杂度始终是 O(n²),即使加了提前退出,在随机数据下也几乎不起作用。它只适合教学、极小数据(≤50 元素)或已基本有序的特殊场景。
- 生产环境请直接用
std::sort()—— 它是混合算法(introsort),平均 O(n log n) - 若需稳定排序且不能用
std::stable_sort(),考虑归并排序而非冒泡 - 调试时可在内层循环末尾加
std::cout 观察每轮结果
真正容易被忽略的是:很多人实现时忘了提前退出优化,或在多线程/并发环境下误以为冒泡“简单所以安全”——其实它不具备任何并发友好特性。
# app
# c++
# 冒泡排序
# 为什么
# Array
# sort
# 封装
# 归并排序
# int
# void
# 循环
# 指针
# 接口
# 函数模板
# 值类型
# 线程
# 多线程
# 并发
# 算法
# 遍历
# 而非
# 的是
# 较前
# 升序
# 很多人
# 只需
# 它是
# 这类
# 可在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
教你用AI将一段旋律扩展成一首完整的曲子
网站建设整体流程解析,建站其实很容易!
SQL查询语句优化的实用方法总结
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
如何获取PHP WAP自助建站系统源码?
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
网站制作壁纸教程视频,电脑壁纸网站?
Laravel PHP版本要求一览_Laravel各版本环境要求对照
如何用免费手机建站系统零基础打造专业网站?
如何挑选高效建站主机与优质域名?
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
bootstrap日历插件datetimepicker使用方法
动图在线制作网站有哪些,滑动动图图集怎么做?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
如何构建满足综合性能需求的优质建站方案?
网站制作企业,网站的banner和导航栏是指什么?
香港服务器租用每月最低只需15元?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
高端企业智能建站程序:SEO优化与响应式模板定制开发
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
免费视频制作网站,更新又快又好的免费电影网站?
javascript读取文本节点方法小结
如何快速使用云服务器搭建个人网站?
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
大连网站制作公司哪家好一点,大连买房网站哪个好?
EditPlus中的正则表达式 实战(1)
JavaScript常见的五种数组去重的方式
如何用已有域名快速搭建网站?
高性价比服务器租赁——企业级配置与24小时运维服务
如何在云主机快速搭建网站站点?
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
如何制作一个表白网站视频,关于勇敢表白的小标题?
如何在云虚拟主机上快速搭建个人网站?
php增删改查怎么学_零基础入门php数据库操作必知基础【教程】
如何在景安服务器上快速搭建个人网站?
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
5种Android数据存储方式汇总
用v-html解决Vue.js渲染中html标签不被解析的问题
C++用Dijkstra(迪杰斯特拉)算法求最短路径
详解jQuery中的事件
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
上一篇:docker可以应用在哪些方面
下一篇:docker里怎样查找容器
上一篇:docker可以应用在哪些方面
下一篇:docker里怎样查找容器

