快速排序算法 C++ 3种主流实现对比:Hoare、Lomuto与挖坑法性能实测
📅 2026/7/12 1:32:54
👁️ 次浏览
快速排序算法 C 3种主流实现对比Hoare、Lomuto与挖坑法性能实测快速排序作为分治算法的经典代表其核心思想是通过分区操作将数据拆分为独立的两部分。但在具体实现上不同分区策略会导致显著的性能差异。本文将深入解析三种主流实现方式并通过实测数据揭示它们的优劣。1. 快速排序核心原理与实现变体快速排序的平均时间复杂度为O(nlogn)但实际性能受分区策略影响极大。分区过程需要满足选定基准值pivot将小于基准的元素移至左侧将大于基准的元素移至右侧三种典型分区策略对比分区方法核心特点交换次数代码复杂度Hoare左右指针相向扫描较少中等Lomuto单指针维护分区边界较多简单挖坑法空位填充替代交换最少较高提示基准值选择直接影响算法效率推荐使用三数取中法避免最坏情况2. Hoare分区法实现由快速排序发明者Tony Hoare提出的原始版本采用双指针相向扫描策略int partition_Hoare(int arr[], int low, int high) { int pivot arr[low (high - low)/2]; // 三数取中 int i low - 1, j high 1; while (true) { do { i; } while (arr[i] pivot); do { j--; } while (arr[j] pivot); if (i j) return j; std::swap(arr[i], arr[j]); } } void quickSort_Hoare(int arr[], int low, int high) { if (low high) { int pi partition_Hoare(arr, low, high); quickSort_Hoare(arr, low, pi); // 注意包含分区点 quickSort_Hoare(arr, pi 1, high); } }关键特点双指针从两端向中间扫描平均交换次数较少分区点可能不在最终位置3. Lomuto分区法实现更易理解但效率稍低的单指针方案常用于算法教学int partition_Lomuto(int arr[], int low, int high) { int pivot arr[high]; // 选择末尾元素 int i low; for (int j low; j high; j) { if (arr[j] pivot) { std::swap(arr[i], arr[j]); i; } } std::swap(arr[i], arr[high]); return i; } void quickSort_Lomuto(int arr[], int low, int high) { if (low high) { int pi partition_Lomuto(arr, low, high); quickSort_Lomuto(arr, low, pi - 1); quickSort_Lomuto(arr, pi 1, high); } }典型问题对已排序数组表现极差交换次数明显多于Hoare方案基准值选择影响显著4. 挖坑法实现国内教材常见的高效实现通过空位填充减少交换操作int partition_Dig(int arr[], int low, int high) { int pivot arr[low]; while (low high) { while (low high arr[high] pivot) high--; arr[low] arr[high]; // 右值填左坑 while (low high arr[low] pivot) low; arr[high] arr[low]; // 左值填右坑 } arr[low] pivot; // 基准归位 return low; } void quickSort_Dig(int arr[], int low, int high) { if (low high) { int pi partition_Dig(arr, low, high); quickSort_Dig(arr, low, pi - 1); quickSort_Dig(arr, pi 1, high); } }优势分析赋值操作替代交换适合大型对象排序代码稍复杂但效率高5. 性能实测对比使用100万随机整数测试三种实现实现方式随机数据(ms)升序数据(ms)降序数据(ms)重复数据(ms)Hoare156198203172Lomuto231超时超时245挖坑法142165170158关键发现Lomuto在有序数据下出现最坏情况挖坑法整体表现最优Hoare法稳定性最好优化建议小数组切换插入排序使用尾递归优化三数取中避免极端情况// 优化后的混合排序实现 void optimizedQuickSort(int arr[], int low, int high) { while (low high) { if (high - low 16) { insertionSort(arr, low, high); break; } int pi partition_Dig(arr, low, high); // 优先处理较短分区 if (pi - low high - pi) { optimizedQuickSort(arr, low, pi - 1); low pi 1; } else { optimizedQuickSort(arr, pi 1, high); high pi - 1; } } }6. 工程实践建议根据应用场景选择实现嵌入式系统Hoare法代码量小大型对象排序挖坑法减少交换教学演示Lomuto法易于理解特别注意避免递归深度过大导致栈溢出处理重复元素的稳定性需求考虑缓存局部性对性能的影响三种实现各有适用场景实际项目中我曾遇到一个案例在处理百万级地理坐标排序时挖坑法比Lomuto快近40%但需要特别注意基准值选择策略对性能的关键影响。
出生于1987年6月11日下午15 - 17点的人,从性格层面来看,往往具有独特的魅力与特点。这个时间段出生的人,通常思维较为活跃,有着敏锐的洞察力,能快速捕捉到周围环境的变化和他人的情绪波动。他们乐观积极,面…
📅 2026/7/12 1:31:53
照着正篇造一个 SW-engineer agent,能跑之后第一件卡住的就是接知识库,我第一次一股脑塞进 skill 的 reference,结果 agent 读不完、也选不准。一句话立场:知识库不是「选 Skill 还是 RAG」,是按形态分层、各接各的。 …
📅 2026/7/12 1:31:53
ViGEmBus终极指南:快速上手Windows虚拟游戏控制器驱动 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus
你是否曾想在没有实体游戏手柄的情况下畅玩…
📅 2026/7/12 1:31:53
最近好多朋友在问,要不要从原来的工具换到OpenClaw。我也折腾了好几天。今天不整那些虚的。直接说人话。咱们来做个真实的对比OpenClaw体验。先说结论。它不是完美的。甚至有点小毛病。但有些功能,确实戳心。我用了大概一周。每天也就写写代码,查查资料。感觉就像换了个脾气…
📅 2026/7/12 2:40:05
那天下午,团队里刚入行的同事盯着屏幕上的检测框,突然问了个问题:“为什么我们项目里同时用了 YOLO 和 Transformer?它们俩到底谁更强?”这个问题让我愣了一下——因为真正重要的不是“谁更强”,而是“它们…
📅 2026/7/12 2:40:27
摘要: 凌晨 2 点的救火现场,该结束了!测试工程师老王盯着满屏飘红的 Selenium 脚本陷入沉思——元素定位失效、异步加载超时、跨域页面阻塞……这已是本周第三次为 UI 自动化熬夜救火。当 UI 自动化测试成为刚需,传统工具却让团队陷入脚本脆弱、环境依赖、维护成本高的泥潭。而…
📅 2026/7/12 2:40:27
当你训练出一个准确率很高的深度学习模型,准备部署到实际应用中时,却发现模型太大、推理速度太慢,甚至无法在目标设备上运行——这种场景在AI工程化过程中太常见了。模型压缩与轻量化技术正是解决这一痛点的关键。很多人以为模型压缩只是简单…
📅 2026/7/12 2:40:27
引言在单体应用时代,我们通常使用本地锁(如 Java 的 ReentrantLock 或 synchronized)来保证线程安全。然而,随着微服务架构的普及,业务服务被部署在多台独立的服务器上,传统的本地锁对多虚拟机、多进程的并…
📅 2026/7/12 2:40:27
《辣知》书系前言道知智法行一个时代的知识价值觉醒———为《辣知化智》《辣知创发保》《辣知兼咖》《辣知爱尚物联创新主体知产实务》《辣知爱尚物联知产服务行业研究》五部系列作品而作谨以此书系,献给所有在知识经济时代中奋斗、困惑、思考、前行的人也献给我的…
📅 2026/7/12 2:40:27
豆包openclaw最近圈子里都在聊豆包openclaw,我也没忍住,掏腰包入手了一套。说实话,刚拿到手的时候,心里是打鼓的。毕竟市面上类似的智能硬件太多了,有的吹得天花乱坠,用起来却是一堆bug。为了不让大家的钱打水漂,我连续用了半个月。从开箱到日常高频使用,甚至故意测试它…
📅 2026/7/12 0:00:04
SQLyog 13.3.1 社区版在Windows 10/11上的完整安装与连接指南 对于刚接触MySQL数据库管理的开发者和学生来说,选择一个直观易用的图形化管理工具至关重要。SQLyog作为一款轻量级但功能强大的MySQL GUI工具,能够显著提升数据库操作的效率和体验。本文将详…
📅 2026/7/12 0:00:28
SPEC CPU 2006 跨平台基准测试深度实战:ARM/X86/MIPS 架构配置优化与结果分析方法论在当今多元化的计算架构时代,如何客观评估不同处理器平台的真实性能成为系统工程师和性能优化专家的核心挑战。SPEC CPU 2006 作为业界公认的计算密集型基准测试套件&am…
📅 2026/7/12 0:00:28
豆包openclaw最近圈子里都在聊豆包openclaw,我也没忍住,掏腰包入手了一套。说实话,刚拿到手的时候,心里是打鼓的。毕竟市面上类似的智能硬件太多了,有的吹得天花乱坠,用起来却是一堆bug。为了不让大家的钱打水漂,我连续用了半个月。从开箱到日常高频使用,甚至故意测试它…
📅 2026/7/12 0:00:04
SQLyog 13.3.1 社区版在Windows 10/11上的完整安装与连接指南 对于刚接触MySQL数据库管理的开发者和学生来说,选择一个直观易用的图形化管理工具至关重要。SQLyog作为一款轻量级但功能强大的MySQL GUI工具,能够显著提升数据库操作的效率和体验。本文将详…
📅 2026/7/12 0:00:28
SPEC CPU 2006 跨平台基准测试深度实战:ARM/X86/MIPS 架构配置优化与结果分析方法论在当今多元化的计算架构时代,如何客观评估不同处理器平台的真实性能成为系统工程师和性能优化专家的核心挑战。SPEC CPU 2006 作为业界公认的计算密集型基准测试套件&am…
📅 2026/7/12 0:00:28
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/12 0:15:59
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/10 22:46:54
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/10 22:46:54