当前位置: 首页 > news >正文

快速排序 (Quick Sort)

1. 原理解析

快速排序是一种基于分治思想的高效排序算法。它的核心逻辑是“先整理,再拆分”:

  1. 选基准(Pivot):从数组中挑出一个元素作为基准(通常选最左边的元素)。
  2. 分区(Partition):通过双指针遍历,把比基准小的数全部放到基准的左边,比基准大(或等于)的数全部放到基准的右边。这一步完成后,基准元素就落在了它最终排序后应该在的绝对位置。
  3. 分而治之:以基准所在的位置为分界线,对左半部分和右半部分数组重复上述过程(递归),直到每个区间只有一个元素或为空。

2. 使用场景

  • 大规模数据排序:由于其优秀的平均时间复杂度O(Nlog⁡N)O(N \log N)O(NlogN)和较小的常数因子,它是工业界最常用的内部排序算法之一。
  • 内存受限环境:与归并排序需要O(N)O(N)O(N)的额外数组不同,快速排序是原地排序(In-place),空间复杂度极低。
  • 不要求稳定性的场景:快速排序是不稳定的排序算法(相同的元素相对位置可能会改变)。

3. 代码实战

Java 版本(双指针原地修改)

publicclassQuickSort{publicstaticvoidquickSort(int[]arr,intleft,intright){// 递归终止条件:区间内只有一个元素或没有元素if(left>=right){return;}// 1. 选取最左边的元素作为基准 (pivot)intpivot=arr[left];inti=left;intj=right;// 2. 开始分区while(i<j){// 先从右往左找,找比 pivot 小的数!(注意顺序,必须 j 先走)while(i<j&&arr[j]>=pivot){j--;}// 再从左往右找,找比 pivot 大的数!while(i<j&&arr[i]<=pivot){i++;}// 如果 i 和 j 还没相遇,说明找到了两个放错位置的元素,交换它们if(i<j){inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}}// 3. 将基准元素放到中间位置// 此时 i 和 j 已经相遇,由于是 j 先走,相遇位置的值一定小于等于 pivotarr[left]=arr[i];arr[i]=pivot;// 4. 分而治之,递归处理左半部分和右半部分quickSort(arr,left,i-1);quickSort(arr,i+1,right);}}

Python 版本(列表推导式直观版)

defquick_sort(arr):# 递归终止条件:数组为空或只有一个元素iflen(arr)<=1:returnarr# 选取基准(取中间元素,避免最坏情况)pivot=arr[len(arr)//2]# 分区操作(利用 Python 列表推导式)left=[xforxinarrifx<pivot]# 比基准小的放左边middle=[xforxinarrifx==pivot]# 等于基准的放中间right=[xforxinarrifx>pivot]# 比基准大的放右边# 递归拼接returnquick_sort(left)+middle+quick_sort(right)

4. 核心难点 / 易错点详解

致命易错点:为什么双指针中,必须是相反方向的指针先走?
如果基准选在最左侧,必须是右指针j先走

生活例子推演:
假设数组是[6, 1, 2, 9, 7, 3],基准是最左边的6
如果让左指针i先走

  1. i从左往右找比 6 大的,找到了9停下。
  2. 此时轮到j走,j从右往左找比 6 小的,结果一直走到碰到了i(因为i9的位置)。两者相遇在元素9处!
  3. 循环结束,执行最后一步:将基准6和相遇点的元素互换。
  4. 互换后变成[9, 1, 2, 6, 7, 3]
    灾难发生:比基准大的9竟然被换到了基准的左边!完全破坏了分区规则。

结论(肌肉记忆口诀)

  • 左边做基准,右边先动(保证相遇点一定比基准小,换到最左边是安全的)。
  • 右边做基准,左边先动(保证相遇点一定比基准大,换到最右边是安全的)。

5. 复杂度分析

  • 时间复杂度
    • 平均情况O(Nlog⁡N)O(N \log N)O(NlogN)。每次基准都能将数组大致平分为两半,递归树深度为log⁡N\log NlogN,每层遍历NNN个元素。
    • 最坏情况O(N2)O(N^2)O(N2)。当数组已经是有序的(正序或逆序),且每次都取最边缘的元素作基准时,每次分区只能排好一个元素,递归树退化成链表。
  • 空间复杂度
    • 平均情况O(log⁡N)O(\log N)O(logN)。原地排序不产生新数组,空间消耗来自于递归函数调用栈的深度。
    • 最坏情况O(N)O(N)O(N)。递归树退化成单链表时,调用栈深度达到NNN
http://www.jsqmd.com/news/523384/

相关文章:

  • 5个最实用的VSLAM开源算法对比:从ORB-SLAM到DROID-SLAM,哪个更适合你的项目?
  • 2025-2026年十大麻将机品牌推荐:智能娱乐空间升级靠谱品牌选购指南 - 十大品牌推荐
  • ODConv (Omni-Dimensional Convolution):全维动态卷积,学习卷积核的四维注意力——YOLOv8 改进实战
  • 2026年十大麻将机品牌推荐:棋牌室商用高性价比品牌及用户口碑真实评价 - 十大品牌推荐
  • 基于Loki+Grafana的Docker容器日志监控实践指南
  • Step3-VL-10B多模态模型与Python爬虫实战:数据采集与智能分析
  • 主流模型调用(二)Open AI
  • 同城推广服务如何选择不踩坑?2026年靠谱推荐软件系统办公高效方案 - 十大品牌推荐
  • 2026年国内沙盘模型优质厂商:实力强、口碑好、靠谱可靠的专业选择 - 深度智识库
  • ‌LTST-C171TGKT‌ 是什么芯片? LED发光二极管 LITE-ON(光宝)进口芯片IC全新原装
  • 隐私计算实践:OpenClaw+Qwen3-32B的本地化数据处理方案
  • 圣女司幼幽-造相Z-Turbo应用实战:生成古风角色图,打造专属视觉内容
  • 手表保养如何选不踩坑?2026年靠谱推荐非官方授权点原厂级技术服务机构 - 十大品牌推荐
  • Docker零基础入门
  • 同城获客软件哪个靠谱?2026年推荐评测五大系统在本地服务业的实际应用 - 十大品牌推荐
  • Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
  • 陕西企事业单位搬迁哪家靠谱?专业公司搬迁服务商深度测评 - 深度智识库
  • 利用有限元建模的悬臂梁 LQR 控制器研究附Matlab代码
  • 2026 私有化部署标杆厂商推荐:企业 / AI 知识库方案商、Deepseek 专属服务商、智能 BI 本地部署厂商一网打尽 - 品牌2026
  • 单细胞数据可视化进阶:用ggplot2打造炫酷UMAP密度图与等高线图
  • 广州市桓大皮革有限公司:服务深耕广东广州,以超纤皮革及其定制服务引领环保皮革新生态 - 十大品牌榜
  • 2025-2026年十大麻将机品牌推荐:智能娱乐空间升级靠谱品牌与案例解读 - 十大品牌推荐
  • 云南钢之友:2026年3月云南钢结构、钢管、型钢、钢板优选供应商 - 深度智识库
  • 六自由度系统弱、强非线性振动参数辨识研究附Python代码
  • 一站式选型指南:2026 知识库部署厂商、Deepseek 服务商、企业 BI 私有化 / 本地部署方案商全品类收录 - 品牌2026
  • 2026年全自动颗粒包装机厂家推荐:粉末/酱料/液体/膏体包装机专业供应与选型指南 - 品牌推荐官
  • 2026年卡地亚手表保养售后维修推荐:古董表修复与疑难机芯处理口碑维修点深度分析 - 十大品牌推荐
  • 直通南美:阿根廷空运专线市场格局与核心企业观察 - 时事观察官
  • C#中using关键字的用法介绍
  • 2026年罩棚网架厂家推荐:济宁金亿豪钢结构,焊接球网架/储煤仓网架/圆形煤场网架/煤棚网架厂家精选 - 品牌推荐官