讲师中心 微信公众号
AI工具推荐 视频效率加速

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

梦晨大大_3092

梦晨大大_3092

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

|

644人浏览过

|

来源于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就切换),避免深层递归开销:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

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

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

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

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

void quick_sort(vector<int>& 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);
}
<p>int partition(vector<int>& 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;
}

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

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

379

2026.04.23

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

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

6396

2023.08.14

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

20

2026.10.28

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

40

2026.10.28

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

120

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

80

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

80

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

40

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn