news 2026/7/5 14:26:11

C++ 快速排序(Quick Sort)深度精讲:分治思想、Lomuto 分区法及三数取中优化,面试手撕必会

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++ 快速排序(Quick Sort)深度精讲:分治思想、Lomuto 分区法及三数取中优化,面试手撕必会

一、算法核心原理(“是什么”与“为什么快”)

快速排序之所以“快”,在于它的分区操作能在一次遍历中将一个元素(基准)放到最终位置上,同时让左右两侧满足大小关系。

相比于希尔排序的“逐渐逼近”,快排采用的是递归分割策略——每次都将问题规模减半,因此平均深度仅为 log₂n。

二、经典 C++ 实现:Lomuto 分区法(最易理解的写法)

这是面试中最推荐手撕的版本,逻辑直观,不易出错。核心是维护一个i指针,指向“小于等于基准的区域的末尾”。

#include <iostream> #include <vector> using namespace std; // 分区函数:将 arr[low..high] 分区,返回基准元素的最终下标 int partition(vector<int>& arr, int low, int high) { int pivot = arr[high]; // 选最右边的元素作为基准 int i = low - 1; // i 指向小于等于 pivot 的区域的最后一个位置 for (int j = low; j < high; j++) { // 当前元素小于等于基准时,将其与 i+1 位置交换,扩大小于区域 if (arr[j] <= pivot) { i++; swap(arr[i], arr[j]); } } // 最后将基准放到中间位置(i+1) swap(arr[i + 1], arr[high]); return i + 1; // 返回基准的最终位置 } // 快速排序递归主函数 void quickSort(vector<int>& arr, int low, int high) { if (low < high) { int pi = partition(arr, low, high); // pi 是基准的索引 quickSort(arr, low, pi - 1); // 递归排左边 quickSort(arr, pi + 1, high); // 递归排右边 } }

三、核心优劣分析(面试必答)

  • 优势 1:极佳的缓存局部性。分区操作是在原数组上顺序遍历,对 CPU 缓存极其友好,常数因子远小于归并排序和堆排序。

  • 优势 2:原地排序(In-place)。除了递归栈开销,不需要额外的大块内存(不像归并需要 O(n) 辅助空间)。

  • 致命短板(最坏情况):当数组已经有序(正序或逆序)且每次选最后一个元素作基准时,分区极度不平衡,递归深度变为 n,时间复杂度退化为O(n²)

四、工程级优化策略(加分项,展示深度)

为了防止最坏情况,C++ 的std::sort(内省排序)混用了快排并加入了保险机制。面试手撕时,你可以主动提出以下几种优化:

  1. 三数取中(Median-of-Three):不选固定端,而是取lowmidhigh三个位置的中位数作为基准,极大降低遇到有序数组时退化的概率。
  2. int mid = low + (high - low) / 2; if (arr[mid] < arr[low]) swap(arr[mid], arr[low]); if (arr[high] < arr[low]) swap(arr[high], arr[low]); if (arr[high] < arr[mid]) swap(arr[high], arr[mid]); swap(arr[mid], arr[high]); // 将中位数放到 high 位置作为 pivot
  3. 小区间插入排序:当子数组长度小于阈值(如 10~15)时,递归开销过大,直接改用插入排序。
  4. 随机化基准int pivot = arr[low + rand() % (high - low + 1)];从概率上规避最坏情况。

五、总结速查

  • 手撕必用:Lomuto 分区法(代码短)。

  • 面试亮点:主动说出“快排是不稳定的”、“有序数组会让它变慢,需要三数取中优化”。

  • 工程警告:写业务代码永远不要手写快排,请直接调用std::sort,因为它是内省排序,已经内置了上述所有优化。

资源推荐

《C++八股文》2026版

贪心算法

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 14:24:47

SQL优化

目录 1. 插入数据优化 2.主键优化 3.order by 排序优化 4.group by 分组优化 5.limit优化 count 的几种用法 count&#xff08;主键&#xff09; count&#xff08;字段&#xff09; count (1) count (*) 7.update语句优化 1. 插入数据优化 1.1 批量插入数据 如果…

作者头像 李华
网站建设 2026/7/5 14:22:29

毕设成品、某宝工作室的水有多深?踩过坑的才敢讲

毕设成品、某宝工作室的水有多深&#xff1f;踩过坑的才敢讲如果你正在闲鱼、某宝、QQ群搜「毕设成品」「一条龙」「包过」—— 先看完这篇再付钱。便宜那几百块&#xff0c;可能换来延毕。一、先说结论&#xff1a;不是成品不能用&#xff0c;是绝大多数你在网上买到的成品&am…

作者头像 李华
网站建设 2026/7/5 14:20:38

如何用scrcpy实现零延迟Android投屏?三大场景让你效率翻倍

如何用scrcpy实现零延迟Android投屏&#xff1f;三大场景让你效率翻倍 【免费下载链接】scrcpy Display and control your Android device 项目地址: https://gitcode.com/GitHub_Trending/sc/scrcpy 还在为手机屏幕太小而烦恼吗&#xff1f;想在电脑上流畅操作Android应…

作者头像 李华
网站建设 2026/7/5 14:20:06

Unity URP卡通着色器入门指南:从零开始打造二次元渲染效果

Unity URP卡通着色器入门指南&#xff1a;从零开始打造二次元渲染效果 【免费下载链接】UnityURPToonLitShaderExample A very simple toon lit shader example, for you to learn writing custom lit shader in Unity URP 项目地址: https://gitcode.com/gh_mirrors/un/Unit…

作者头像 李华
网站建设 2026/7/5 14:19:55

大模型学习指南:小白程序员轻松入门,收藏这份高薪转岗秘籍!

文章核心内容围绕AI大模型应用开发的学习路径展开&#xff0c;强调其重要性和高薪前景。文章提供了详细的学习清单和资料&#xff0c;涵盖大模型基础认知、核心技术模块、开发基础能力、应用场景开发、项目落地流程以及面试求职冲刺等六大模块&#xff0c;旨在帮助读者快速入门…

作者头像 李华
网站建设 2026/7/5 14:18:18

技术革命:EmojiOne Color如何重塑表情符号的跨平台标准

技术革命&#xff1a;EmojiOne Color如何重塑表情符号的跨平台标准 【免费下载链接】emojione-color OpenType-SVG font of EmojiOne 2.3 项目地址: https://gitcode.com/gh_mirrors/em/emojione-color 在数字界面设计中&#xff0c;表情符号已成为现代通信不可或缺的视…

作者头像 李华