0

0

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

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-02-07 07:23:26

|

657人浏览过

|

来源于php中文网

原创

正确冒泡排序需两层循环,内层上限为n-1-i防越界,用std::swap保类型安全,加swapped标志提前退出;模板版应支持迭代器和自定义比较,但实际项目应优先用std::sort。

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

冒泡排序在 C++ 里写起来很简单,但直接套模板容易出错——尤其边界条件、优化逻辑和类型安全这三块最容易翻车。

怎么写一个基础但正确的 bubble_sort 函数

核心是两层循环:外层控制轮数(最多 n-1 轮),内层做相邻比较与交换。关键点不是“能跑”,而是“不越界、不漏排”:

  • 内层循环上限必须是 n - 1 - ii 是外层轮数),否则每轮都扫到底,浪费且可能访问 arr[n]
  • std::swap 而不是手写交换,避免自赋值问题和类型不兼容(比如 std::string
  • 数组长度建议用 size_t 或带符号类型明确处理,别混用 intsize_t 做减法,否则 i > n 时会绕成极大正数

示例:

void bubble_sort(std::vector& arr) {
    size_t n = arr.size();
    for (size_t i = 0; i < n - 1; ++i) {
        for (size_t j = 0; j < n - 1 - i; ++j) {
            if (arr[j] > arr[j + 1]) {
                std::swap(arr[j], arr[j + 1]);
            }
        }
    }
}

怎么加提前退出优化(避免 O(n²) 变成真 O(n²))

冒泡排序的天然优势是「发现已有序时可提前结束」,但很多人加了 bool swapped 却忘了重置它:

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

  • 每轮开始前必须设 swapped = false,否则一次没换就永远不进下一轮
  • 只在发生交换时才置 true,不能靠 if 外部变量判断
  • 这个优化对几乎有序的数据效果明显,但对随机数据影响不大,别误以为它能“大幅提速”

改写片段:

SkyReels
SkyReels

SkyReels是全球首个融合3D引擎与生成式AI的AI视频创作平台

下载
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;
}

用模板写通用版本要注意什么

想让它支持 doublestd::string 甚至自定义类?模板没问题,但有三个硬约束:

  • 必须要求类型支持 operator>(或传入比较函数),否则 arr[j] > arr[j + 1] 编译不过
  • 容器不能只假设 std::vector,最好用迭代器接口,比如接受 RandomIt first, RandomIt last
  • 别在模板里用 using namespace std,会导致 ADL(参数依赖查找)异常或命名冲突

最小可用模板签名:

template >
void bubble_sort(RandomIt first, RandomIt last, Compare comp = {}) {
    for (auto i = first; i != last; ++i) {
        bool swapped = false;
        for (auto j = first; j < last - 1 - (i - first); ++j) {
            if (comp(*(j + 1), *j)) {
                std::swap(*j, *(j + 1));
                swapped = true;
            }
        }
        if (!swapped) break;
    }
}

为什么你不该在实际项目里用它

不是代码写得不对,而是场景错配:

  • STL 的 std::sort 平均 O(n log n),且对小数组自动切到插入排序,比手写冒泡稳得多
  • 即使你只排 20 个元素,std::sort 的常数因子也更小;而冒泡的缓存不友好(频繁跨距访问)在现代 CPU 上代价更高
  • 唯一合理用途:教学演示算法思想,或嵌入式环境禁用 STL 且数据量极小(

真正要动手写排序时,先问自己:是不是非得手写?是不是非得冒泡?这两个“是”同时成立的情况,比想象中少得多。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
string转int
string转int

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

606

2023.08.02

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

797

2023.08.22

sort排序函数用法
sort排序函数用法

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

397

2023.09.04

string转int
string转int

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

606

2023.08.02

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

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

551

2024.08.29

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

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

173

2025.08.29

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

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

204

2025.08.29

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

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

173

2025.08.29

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.06

热门下载

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

精品课程

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

共578课时 | 59.2万人学习

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

共12课时 | 1.0万人学习

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

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