news 2026/7/7 10:10:47

快速排序(Quick Sort)的“死穴”

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
快速排序(Quick Sort)的“死穴”

快速排序(Quick Sort)的“死穴”,也就是它的最坏情况

简单来说,它的意思是:如果你运气不好,选的基准值(Pivot)太极端,快速排序就会变得非常慢,慢得像冒泡排序一样。

我来把这张图里的“行话”翻译成大白话,配合具体的例子演示。


1. 快速排序的理想状态 vs. 糟糕状态

快速排序的核心思想是“分治”(分而治之)。

  • 理想情况:选一个基准值(比如中间大小的数),它能把数组一分为二(左边一半,右边一半)。每轮都减半,速度极快。

  • 糟糕情况(PPT里的情况):选的基准值是最大最小的数。它没能把数组切开,只是把最边上的一个切下来了,剩下的一大坨还在那一侧。


2. 结合 PPT 中的例子演示

PPT 里举了两个例子,一个是倒序的,一个是正序的。通常教科书里的快速排序默认取第一个元素作为基准值(Pivot)

例子 A:倒序数组(90, 85, 79, 74, ...)

假设我们总是取第一个数做基准(Pivot = 90)。

  1. 第一轮

    • 基准:90

    • 比较:剩下的所有数 (85, 79, 74...) 都比 90 小。

    • 划分结果

      • 左边子序列:(85, 79, 74, 68, 50, 46)(也就是除了90以外的所有人)

      • 右边子序列:()(空空如也,因为没人比90大)

    • 代价:我们忙活了一整轮,只把90这一个数排好了位置。

  2. 第二轮(处理左边那一堆):

    • 基准:85(现在的第一个)

    • 比较:剩下的 (79, 74...) 都比 85 小。

    • 划分结果:又是一边倒。85 右边是空的,左边还是那一堆。

结论:这就像切西瓜,原本想一刀两半,结果你每一刀都只切下来薄薄的一层皮。你要切 N 次才能切完。

例子 B:正序数组(46, 50, 68, ...)

道理是一样的。

  1. 基准:46。

  2. 比较:剩下的所有数 (50, 68...) 都比 46 大。

  3. 划分结果

    • 左边子序列:()(空的)

    • 右边子序列:(50, 68, 74, ...)(所有人都在右边)


3. 为什么 PPT 说“退化为冒泡排序”?

你看上面的过程:

  • 快速排序(最坏情况):第一轮搞定 1 个数(90),第二轮搞定 1 个数(85),第三轮搞定 1 个数(79)...

  • 冒泡排序:第一轮冒出一个最大值(搞定1个),第二轮冒出第二大值(搞定1个)...

它们的工作效率变成一模一样的了!

  • 正常快排复杂度:O(nlogn) (类似树形结构,层数少)

  • 退化后的复杂度:O(n2) (类似链表结构,层数变成了 N 层,非常慢)

4. 树形图解对比

为了让你直观感受区别,我画个图:

理想的快速排序(平衡树):每次都运气好,选到中间值,两边均匀。

代码段

graph TD A[50] --> B[25] A --> C[75] B --> D[10] B --> E[40] C --> F[60] C --> G[90]

PPT 里的最坏情况(歪脖子树):每次都选到最大或最小(有序数组选第一个数就会这样)。

代码段

graph TD A[90] --> B[85] B --> C[79] C --> D[74] D --> E[68] E --> F[...]

看,下面这棵“歪脖子树”明显比上面的“平衡树”要深得多,走的路更长,所以效率极低。

总结 PPT 的红框结论

“快速排序不适于对原本有序或基本有序的记录序列进行排序。”

这句话的意思是: 如果你拿到一个数组,发现它已经是排好序的(或者倒序的),这时候如果你还傻乎乎地用“取第一个元素当基准”的快速排序去排它,那就是自寻死路,效率最低。

那怎么办?实际工程中,为了避免这种尴尬,我们通常随机选基准,或者三数取中(取头、中、尾三个数的中间值当基准),这样就能避开这种“死穴”了。

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

web前端:CSS-Doodle万花筒效果

设计概述本次分享将介绍如何使用CSS-Doodle库创建一个动态视觉效果的 "万花筒" 页面。这个项目通过CSS-Doodle特有的网格系统和动态样式生成能力,结合出色彩斑斓、不断变化的几何图案,营造出类似万花筒的视觉体验。CSS-Doodle是一个基于Web Co…

作者头像 李华
网站建设 2026/7/7 5:47:21

Redis篇2——Redis深度剖析:从SetNX到Redisson,分布式锁的进化之路

在上一篇文章中,深入剖析了Redis的底层数据结构。那其实只是 Redis 的微观世界。今天,我们将镜头拉远,来到宏观的分布式系统架构中,聊聊 Redis 在生产环境中最著名的应用场景——分布式锁。包含如下细节:“你这把锁&am…

作者头像 李华
网站建设 2026/7/6 15:55:57

C++学习之旅【C++类和对象(下)】

🔥承渊政道:个人主页 ❄️个人专栏: 《C语言基础语法知识》 《数据结构与算法初阶》《C初阶知识内容》 ✨逆境不吐心中苦,顺境不忘来时路! 🎬 博主简介: 引言:前篇小编介绍了关于C类和对象(中)的内容,本篇将继续介绍C类和对象(下)的内容,至此…

作者头像 李华
网站建设 2026/7/6 14:24:24

Nordic-nRF54L 系列架构全景:从蓝牙 6.0 到超低功耗设计详解

文章目录1、nRF54L系列总概括2、nRF54L系列功能3、电源域1. 中央处理单元(CPU核心)2. 内存架构3. 外设模块与总线分层4. 电源域(Power Domains)5. 关键互连结构6. 调试与安全7. GPIO与扩展性8.如何理解这张图?4、内存1…

作者头像 李华
网站建设 2026/7/7 15:21:19

基于多智能体系统一致性算法的电力系统分布式经济调度策略-谢俊论文的复现。 包括10个发电单元和...

基于多智能体系统一致性算法的电力系统分布式经济调度策略-谢俊论文的复现。 包括10个发电单元和19个柔性负荷单元。 能完美的实现复现打开Python环境准备撸码的时候,突然意识到电力系统这玩意儿真不能硬刚——29个单元在分布式架构里玩经济调度,光是通信…

作者头像 李华