0

0

如何用C++实现快速排序算法?C++分治算法思想与实践【算法教程】

冰火之心

冰火之心

发布时间:2025-12-21 08:51:08

|

624人浏览过

|

来源于php中文网

原创

快速排序核心是分治:选基准将数组分为小于、等于、大于三部分,递归处理左右;需避免最坏O(n²),推荐随机选或三数取中选基准,并用Lomuto/Hoare双指针原地分区。

如何用c++实现快速排序算法?c++分治算法思想与实践【算法教程】

快速排序用C++实现,核心是分治:选一个基准(pivot),把数组分成三部分——小于、等于、大于基准的元素,再递归处理左右两部分。关键不在“快”,而在“分得清、治得稳”。

选好基准,别硬挑第一个

基准选得太偏(比如总选首尾),最坏情况会退化成O(n²)。实际中常用三种策略:

  • 随机选:用rand() % (right - left + 1) + left取下标,再和末尾交换
  • 三数取中:取首、中、尾三个数的中位数作基准,抗有序/逆序数据效果好
  • 避免重复拷贝:直接在原数组上分区,不用额外容器存“等于”部分

双指针分区,原地完成

推荐Lomuto或Hoare分区方案。Lomuto更易懂,用一个游标i标记“

  • 遍历j从left到right−1,遇到≤pivot的数,就swap(arr[++i], arr[j])
  • 最后swap(arr[i+1], arr[right]),把pivot放到正确位置
  • 返回i+1,即pivot最终下标,左右子数组就是[left, i]和[i+2, right]

递归控制,别忘剪枝

小数组用插入排序更高效(一般n ≤ 10就切换),避免深层递归开销:

跃问视频
跃问视频

阶跃星辰推出的AI视频生成工具

下载

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

  • if (right - left
  • 递归调用前检查区间长度,空或单元素直接return
  • 尾递归优化可手动转为while循环(只对较大子段递归,小子段立即处理)

完整可运行示例(简洁版)

以下代码含随机基准 + Lomuto分区 + 小数组优化:

void quick_sort(vector& arr, int left = 0, int right = -1) {
    if (right == -1) right = arr.size() - 1;
    if (left >= right) return;
    if (right - left <= 10) {
        insertion_sort(arr, left, right);
        return;
    }
    // 随机选基准并换到末尾
    int rnd = left + rand() % (right - left + 1);
    swap(arr[rnd], arr[right]);
    int pivot_idx = partition(arr, left, right);
    quick_sort(arr, left, pivot_idx - 1);
    quick_sort(arr, pivot_idx + 1, right);
}

int partition(vector& arr, int left, int right) { int pivot = arr[right], i = left - 1; for (int j = left; j < right; ++j) { if (arr[j] <= pivot) swap(arr[++i], arr[j]); } swap(arr[i + 1], arr[right]); return i + 1; }

基本上就这些。分治不是玄学,是“先想清楚怎么拆,再放心交给自己去算”。写快排时多调试几个边界案例(全等、已序、逆序、两个数),比背模板管用得多。

相关专题

更多
页面置换算法
页面置换算法

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

402

2023.08.14

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

9

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

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

32

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

14

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

42

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

6

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

9

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

6

2026.01.15

php图片上传教程汇总
php图片上传教程汇总

本专题整合了php图片上传相关教程,阅读专题下面的文章了解更多详细教程。

2

2026.01.15

热门下载

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

精品课程

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

共94课时 | 6.9万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 12.5万人学习

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

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