0

0

C++冒泡排序怎么写 C++十大经典排序算法实现代码【算法】

穿越時空

穿越時空

发布时间:2026-01-29 10:19:02

|

416人浏览过

|

来源于php中文网

原创

标准冒泡排序用两层for循环实现:外层控制n-1轮,内层逐对比较相邻元素并交换,确保每轮最大值沉底;常见错误是内层边界误写为i而非n-1-i。

c++冒泡排序怎么写 c++十大经典排序算法实现代码【算法】

冒泡排序的 C++ 基础实现长什么样

标准冒泡排序就是两层 for 循环,外层控制轮数(最多 n-1 轮),内层逐对比较相邻元素并交换。关键在于「相邻」和「每轮后最大值沉底」这个逻辑。

常见错误是内层循环边界写成 i 导致越界,或漏掉 swap 后的边界收缩(每轮后末尾已有序,可缩短比较范围):

void bubbleSort(vector& arr) {
    int n = arr.size();
    for (int i = 0; i < n - 1; ++i) {
        for (int j = 0; j < n - 1 - i; ++j) { // 注意:上限是 n-1-i,不是 n-1
            if (arr[j] > arr[j + 1]) {
                swap(arr[j], arr[j + 1]);
            }
        }
    }
}

怎么提前终止优化冒泡排序

如果某一轮内一次交换都没发生,说明数组已完全有序,后续轮次纯属浪费。加个标志位就能让最好情况时间复杂度从 O(n²) 降到 O(n)

容易忽略的是:标志位必须在每轮开始前重置为 false,否则会误判;且不能只靠外层 i 判断是否提前退出。

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

  • bool swapped = false 记录本轮是否有交换
  • 每次交换后设为 true
  • 本轮结束若仍是 false,直接 break
void bubbleSortOptimized(vector& arr) {
    int n = arr.size();
    for (int i = 0; i < n - 1; ++i) {
        bool swapped = false;
        for (int j = 0; j < n - 1 - i; ++j) {
            if (arr[j] > arr[j + 1]) {
                swap(arr[j], arr[j + 1]);
                swapped = true;
            }
        }
        if (!swapped) break; // 没交换,已有序
    }
}

C++ 中 vector 和原生数组写法有啥区别

核心逻辑一致,但传参方式和长度获取不同。用 vector 更安全(自动管理内存、支持 .size()),而原生数组传参会退化为指针,必须额外传长度。

Toolplay
Toolplay

一站式AI应用聚合生成平台

下载

常见坑是把数组名直接传给函数却没传 len,导致无法知道边界;或者误用 sizeof(arr)/sizeof(arr[0]) 在函数内部计算长度(此时 arr 是指针,结果恒为 1 或 2)。

  • 原生数组推荐签名:void bubbleSort(int arr[], int len)
  • 别在函数里用 sizeof 算长度
  • 迭代器版本更泛型,但初学易绕晕,不建议一上来就写

为什么它被列为“经典”却不该在实际项目中用

冒泡排序教学价值远大于实用价值。它的 O(n²) 时间复杂度、频繁的交换操作(比快排/归并多得多)、以及无法利用 CPU 缓存局部性,让它在任何稍大点的数据集上都明显慢于 std::sort(通常是 introsort,平均 O(n log n))。

真正要注意的是:面试写冒泡时,考官往往看的是你能否指出它的缺陷、能否写出带提前终止的版本、能否对比它和插入排序的异同——而不是只默写一个能跑通的循环。

如果你真在工程代码里写了冒泡排序,而且数据量超过几百,那问题大概率不在算法本身,而在你没搞清需求或没查 STL 文档。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

391

2023.09.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

544

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

93

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

javascriptvoid(o)怎么解决
javascriptvoid(o)怎么解决

javascriptvoid(o)的解决办法:1、检查语法错误;2、确保正确的执行环境;3、检查其他代码的冲突;4、使用事件委托;5、使用其他绑定方式;6、检查外部资源等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

177

2023.11.23

java中void的含义
java中void的含义

本专题整合了Java中void的相关内容,阅读专题下面的文章了解更多详细内容。

98

2025.11.27

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

409

2023.08.14

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

0

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 52.8万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号