快速排序【hoare】--附图示以及代码
霍尔快速排序Hoare’s Quicksort详细介绍一、核心思想利用分治思想通过单趟排序把数组a划分成左右两段左段所有元素 ≤ 枢轴值a[keyi]右段所有元素 ≥ 枢轴值a[keyi]递归地对左右段做同样的处理最终完成整个数组的排序。1.1 算法步骤选枢轴三数取中拿到中值索引与a[left]交换后固定keyi left以a[keyi]为基准。分区用left、right两个指针相向扫描右边找a[right] a[keyi]左边找a[left] a[keyi]找到后swap交换直到left和right相遇最后swap(a[keyi], a[meeti])将枢轴放到正确位置返回meeti递归排序对[left_initial, meeti-1]和[meeti1, right_initial]两个子区间重复上述过程直到区间长度 ≤ 1。1.2 霍尔分区的详细步骤分区准备当前待分区的区间为[left, right]。为减少最坏情况出现的概率代码已使用三数取中法选出中值元素并将其交换到a[left]位置。此后以a[keyi]作为基准值枢轴其中keyi left。指针初始化右指针right初始指向区间右端点左指针left初始指向区间左端点。循环扫描与交换在left right的条件下反复执行以下流程右指针right不断向左移动自减直到找到第一个严格小于基准值的元素即a[right] a[keyi]。移动过程中始终保证left right。左指针left不断向右移动自增直到找到第一个严格大于基准值的元素即a[left] a[keyi]。移动过程中始终保证left right。如果此时仍然满足left right说明左右各找到了需要交换的元素于是交换a[left]和a[right]然后继续下一轮扫描。若left right说明指针已经相遇或交错扫描阶段结束。循环不变量在扫描的全过程中始终成立指针left左侧不含left本身的所有元素均 ≤a[keyi]指针right右侧不含right本身的所有元素均 ≥a[keyi]。分区完成当左右指针相遇或交错后记相遇位置为meeti left此时有left right。最后执行一次交换swap(a[keyi], a[meeti])将基准值放入它在完全排序后的正确位置。函数最终返回meeti。此时数组被划分为三个部分a[left_initial … meeti-1]元素全部 ≤ 基准值a[meeti]基准值本身已处于正确排序位置a[meeti1 … right_initial]元素全部 ≥ 基准值。二、动图演示三、快速排序的复杂度与稳定性分析时间复杂度快速排序的时间复杂度取决于每次分区操作的平衡程度与数据分布密切相关。最好情况O(n log n)当每次选择的基准值枢轴都能将数组均匀划分为两个大小相近的子区间时递归深度为 log n每层比较次数为 O(n)总复杂度为 O(n log n)。最坏情况O(n²)当每次选择的基准值都是当前区间的最小值或最大值例如数组已有序且未做任何优化时每次分区只划分出一个空区间和一个大小为 n-1 的区间递归深度变为 n每层比较次数为 O(n)总复杂度退化为 O(n²)。通过随机选择基准或三数取中法可大幅降低最坏情况出现的概率。平均情况O(n log n)在随机数据下基准值落在区间中部附近的概率较高递归树趋于平衡数学期望为 O(n log n)。快速排序在实际应用中通常表现优异常数因子较小。空间复杂度快速排序的空间消耗主要来自递归调用栈辅助空间为 O(1)原地分区。递归栈深度平均情况下递归深度为 O(log n)因此空间复杂度为O(log n)。最坏情况下极端不平衡递归深度为 O(n)空间复杂度退化为O(n)。辅助数组无需额外数组所有交换在原数组上完成额外空间仅用于几个临时变量为 O(1)。若采用尾递归优化或迭代实现可将栈空间进一步降低但最坏情况仍可能达到 O(n)。稳定性快速排序是一种不稳定的排序算法。原因在分区过程中元素通过交换swap移动位置相同的元素可能因为基准值的移动而改变相对顺序。示例数组[2a, 1, 2b]两个相等的 2 分别标记为 a、b若基准值为 1则分区后2b可能被换到2a前面导致相对顺序变化。若需保持稳定性可选择归并排序或插入排序等稳定算法。四、示例代码#define_CRT_SECURE_NO_WARNINGS#includestdio.h#includeassert.h//交换voidswap(int*p1,int*p2){inttemp*p1;*p1*p2;*p2temp;}//三数取中intGetMidIndex(int*a,intleft,intright){intmidleft(right-left)/2;if(a[left]a[mid]){if(a[mid]a[right]){returnmid;}elseif(a[left]a[right]){returnleft;}elsereturnright;}else// a[left] a[mid]{if(a[mid]a[right]){returnmid;}elseif(a[left]a[right]){returnleft;}elsereturnright;}}//hoare法intPartSort1(int*a,intleft,intright){intmidGetMidIndex(a,left,right);swap(a[left],a[mid]);intkeyileft;while(leftright){while(leftrighta[right]a[keyi]){right--;}while(leftrighta[left]a[keyi]){left;}if(leftright){swap(a[right],a[left]);}}intmeetleft;swap(a[keyi],a[meet]);returnmeet;}intmain(){intarr[]{6,1,2,7,9,3,4,5,10,8};intnsizeof(arr)/sizeof(arr[0]);intleft0;intrightn-1;QuickSort(arr,left,right);for(inti0;in;i){printf(%d ,arr[i]);}return0;}

相关新闻

【AI量化实战黄金法则】:20年量化老兵亲授5大不可绕过的AI建模陷阱与避坑指南

【AI量化实战黄金法则】:20年量化老兵亲授5大不可绕过的AI建模陷阱与避坑指南

更多请点击: https://codechina.net 第一章:AI量化技术的基本范式与演进脉络 AI量化技术融合了人工智能算法与金融工程方法,其核心范式围绕“数据驱动决策—模型自动迭代—策略闭环验证”展开。早期以统计套利和因子挖掘为主,依赖…

2026/10/12 23:26:03 阅读更多 →
如何用KeymouseGo实现桌面自动化:3步告别重复性工作

如何用KeymouseGo实现桌面自动化:3步告别重复性工作

如何用KeymouseGo实现桌面自动化:3步告别重复性工作 【免费下载链接】KeymouseGo 类似按键精灵的鼠标键盘录制和自动化操作 模拟点击和键入 | automate mouse clicks and keyboard input 项目地址: https://gitcode.com/gh_mirrors/ke/KeymouseGo 你是否厌倦…

2026/10/7 7:44:14 阅读更多 →
抖音下载工具深度指南:从零到批量管理的完整解决方案

抖音下载工具深度指南:从零到批量管理的完整解决方案

抖音下载工具深度指南:从零到批量管理的完整解决方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…

2026/10/13 15:59:23 阅读更多 →

最新新闻

基于JavaWeb的图书馆管理系统:从数据库设计到答辩全流程拆解

基于JavaWeb的图书馆管理系统:从数据库设计到答辩全流程拆解

每年我的邮箱和私信都会被同一个问题塞满:“老师,有没有现成的毕设项目?最好简单点、能跑通、好答辩。”今年那批600套毕设分享出来之后,我翻了一圈,发现图书馆管理系统仍然是出现频率最高的题目之一。说句实话&#x…

2026/10/13 15:59:05 阅读更多 →
VirtualBox VMX源码深度解析:VMCS结构与硬件虚拟化实现

VirtualBox VMX源码深度解析:VMCS结构与硬件虚拟化实现

1. 为什么从VMX切入看VirtualBox源码——不是选最炫的,而是选最“痛”的很多人一看到“VirtualBox源码分析”,第一反应是去翻src/VBox/Devices里那些网卡、显卡模拟器的代码,觉得“看得见摸得着”。我试过,也这么干过——结果两周…

2026/10/13 15:59:05 阅读更多 →
精品水果线上销售网站设计与实现:Spring Boot+Vue全栈电商实战

精品水果线上销售网站设计与实现:Spring Boot+Vue全栈电商实战

1. 内容整体设计与思路拆解做毕业设计选“精品水果线上销售网站”,这个题目乍一看平平无奇,但真正动手做起来,你会发现它其实是把前端展示、后端业务、数据库设计、支付流程、权限控制全串起来的一个完整闭环。我见过太多人选电商类题目最后做…

2026/10/13 15:59:05 阅读更多 →
基于Spring Boot+Vue的精品水果销售网站设计与实现全解析

基于Spring Boot+Vue的精品水果销售网站设计与实现全解析

这段时间正好在帮一位学弟审他的毕业设计,题目就是“精品水果线上销售网站的设计与实现”。说实话,看到这个题目的时候我愣了一下——现在网上商城类的毕设选题太多了,图书、服饰、数码应有尽有,但“精品水果”这个切入点有点意思…

2026/10/13 15:59:05 阅读更多 →
LiteLLM实战:统一大模型API调用与代理网关搭建指南

LiteLLM实战:统一大模型API调用与代理网关搭建指南

如果你和我一样,每天要跟三四个不同的大模型API打交道,可能早就被这一堆SDK和鉴权方式搞得头大了。我一开始是拿LiteLLM当“偷懒工具”用的:它能把OpenAI、Anthropic、Gemini这些五花八门的接口统一成一个Python调用,后来才发现这…

2026/10/13 15:59:05 阅读更多 →
STM32电源闭环控制:ADC触发+双环PID+硬件保护实战

STM32电源闭环控制:ADC触发+双环PID+硬件保护实战

简介:本资源为电子设计大赛(电赛)电源类专项程序代码合集,面向高校电子类专业学生、电赛备赛团队及嵌入式电源系统开发者,聚焦电源管理、闭环控制与硬件协同等核心难点,助力快速构建稳定可靠的电源子系统。…

2026/10/13 15:58:04 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →