0

0

C++怎么实现快速排序_C++经典算法教程【高效】

冰火之心

冰火之心

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

|

901人浏览过

|

来源于php中文网

原创

std::sort 绝大多数情况下比手写快排更快更安全,因其采用 introsort(快排+堆排+插入排序混合),避免最坏 o(n²),自动优化小数组和递归深度;仅在特定场景下手写快排可能占优。

c++怎么实现快速排序_c++经典算法教程【高效】

std::sort 是不是比手写快排更快

绝大多数情况下,std::sort 不仅更安全,而且实际运行更快。它在 libstdc++ 和 libc++ 中都不是纯快排,而是 introsort(快排 + 堆排 + 插入排序混合),能避免最坏 O(n²) 情况,同时对小数组自动切到插入排序,对深度递归自动切换为堆排。

手写快排只有在极特殊场景下才可能赢:比如你完全掌控数据分布(如大量重复元素)、内存严格受限、或需要定制分区逻辑(如按多个字段稳定比较)。否则,直接用 std::sort 是更优解。

常见错误现象:std::sort 报错 “invalid comparator”,通常是因为自定义比较函数不满足严格弱序——比如 a 和 <code>b 同时为 true,或 <code>comp(a, a) 返回 true。

  • 确保比较函数满足:对任意 acomp(a, a) 必须为 false
  • 若需稳定排序,改用 std::stable_sort,但注意它平均复杂度仍是 O(n log n),且常数更大
  • std::vector 排序,别传 &v[0]&v[0] + v.size() —— 直接用 v.begin() / v.end() 更安全、可读性更好

手写快排时 pivot 选错会卡成 O(n²)

选第一个/最后一个元素当 pivot,在已排序或逆序数组上会退化。这不是理论风险,是真实高频踩坑点——比如读配置文件后对 ID 列表排序,结果发现某次上线后 CPU 突增。

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

实操建议:

uBrand
uBrand

一站式AI品牌创建平台,在线品牌设计,AI品牌策划,智能品牌营销;uBrand帮助创业者轻松打造个性品牌!

下载
  • 用三数取中法:取首、中、尾三个位置的值,选中位数作为 pivot;std::nth_element 可辅助实现,但别在每层递归都调,开销大
  • 随机化更简单:在分区前,用 std::uniform_int_distribution 随机选一个索引,和首元素 swap
  • 别用 rand() % size —— 低比特周期短,且 rand() 在多线程下非线程安全;优先用 std::random_device + std::mt19937

原地分区写错导致越界或死循环

经典双指针分区(Lomuto 或 Hoare)里,边界条件稍有不慎就会访问 arr[-1] 或陷入 i 永真循环。尤其在处理重复元素多的数组时,Hoare 版本若不严格控制移动逻辑,很容易漏交换或越界。

推荐用 Lomuto 分区(更易验证),关键点:

  • i 指向「已处理区」末尾(即所有 的右边界),初始为 <code>low - 1
  • 遍历 jlowhigh - 1,不是 high;最后 swap arr[i + 1]arr[high]
  • 递归调用时,左右区间分别是 [low, i][i + 2, high] —— 注意不是 i+1,因为 i+1 是 pivot 最终位置,已确定

示例片段(简化版):

void quicksort(vector<int>& arr, int low, int high) {
    if (low >= high) return;
    int pi = partition(arr, low, high); // 返回 pivot 最终索引
    quicksort(arr, low, pi - 1);
    quicksort(arr, pi + 1, high);
}

迭代版快排为什么比递归版难写还未必更快

用栈模拟递归,本意是防栈溢出,但实际中除非你明确知道输入规模会达到万级深度(比如链表转数组后排序),否则收益有限。现代系统默认栈空间几 MB,对应约 10⁴ 层递归,而快排平均深度仅 O(log n) —— 即使 10⁷ 元素,平均也才约 24 层。

真正容易被忽略的点:

  • 手动管理栈时,压入区间顺序影响缓存局部性:先压大区间再压小区间,能降低栈最大深度;但若先压小区间,虽栈深略增,却可能提升 cache hit 率
  • 迭代版代码体积翻倍,调试困难,且容易在边界计算(如 left/right 开闭区间混用)上出错
  • 编译器对尾递归优化有限,但对 std::sort 这类高度优化的实现,其内建迭代逻辑已足够健壮——你手写的迭代版几乎不可能超越

除非你在嵌入式环境跑超大数组且禁用栈扩容,否则别碰迭代快排。把精力放在用好 std::sort 和理解它的 fallback 行为上更实在。

热门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参数的值,用于指定排序的依据。

404

2023.09.04

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

422

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

595

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

715

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

371

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

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

26

2026.01.21

C++多线程相关合集
C++多线程相关合集

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

25

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

99

2026.02.06

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1030

2026.02.13

热门下载

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

精品课程

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

共94课时 | 10万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 18.9万人学习

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

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