惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

SecWiki News
SecWiki News
I
InfoQ
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
博客园 - Franky
T
Tailwind CSS Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
博客园_首页
罗磊的独立博客
V
V2EX
李成银的技术随笔
大猫的无限游戏
大猫的无限游戏
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
True Tiger Recordings
Vercel News
Vercel News
Cyberwarzone
Cyberwarzone
Cisco Talos Blog
Cisco Talos Blog
F
Fox-IT International blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
M
Microsoft Research Blog - Microsoft Research
Know Your Adversary
Know Your Adversary
爱范儿
爱范儿
The Register - Security
The Register - Security
G
Google Developers Blog
The Hacker News
The Hacker News
Malwarebytes
Malwarebytes
S
Securelist
博客园 - 三生石上(FineUI控件)
Jina AI
Jina AI
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
S
SegmentFault 最新的问题
博客园 - 叶小钗
F
Fortinet All Blogs
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
博客园 - 聂微东
T
Threatpost
博客园 - 【当耐特】
D
Docker
P
Privacy & Cybersecurity Law Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
G
GRAHAM CLULEY
V
Visual Studio Blog
C
Cisco Blogs
IT之家
IT之家
S
Security Archives - TechRepublic
Latest news
Latest news
阮一峰的网络日志
阮一峰的网络日志

Keenwon's Blog

Mac 安装 Ollama 和 Open WebUI PVE 动态分配虚拟机的内存 - Keenwon's Blog ubuntu crontab 定时执行 node 程序 Node.js SEA - Keenwon's Blog 基于 Web Vitals 的前端性能优化实践 CSS 奇技淫巧 —— 绝对居中布局 - Keenwon's Blog Fresh 快速入门 - Keenwon's Blog Islands Architecture - Keenwon's Blog Awesome Command-line Utilities
快速排序第 N 趟的可能结果 - Keenwon's Blog
semanwmj@gmail.com (keenwon) · 2024-10-15 · via Keenwon's Blog

最近公司组织所有人参加「技术能力认证」,被迫刷题,遇到个挺意思的问题,完全搞明白还是花了点时间的,这里记录一下,免得以后忘了...

题目#

假设一个数组采用快速排序,则下面的选项中,不可能是第 3 趟排序结果的是?

  • A:4, 8, 6, 10, 12, 16, 14
  • B:10, 4, 6, 8, 12, 14, 16
  • C:8, 4, 6, 12, 10, 14, 16
  • D:4, 8, 6, 12, 10, 16, 14

解析#

忘记了快速排序的朋友可以在这里复习下,确保清楚算法的每一步操作,这是完成本题的基本条件。

先来明确两个概念:

  • :把未排序的元素遍历一遍就是 1 趟
  • 最终位置:就是指一个数字在排序好的数组内的位置,比如 [0, 9, 7, 5] 从小到大排序,0 最小并且已经在第一位了,就可以说 0 已经在「最终位置」上了。

接下来咱们分析快速排序的「趟」和「最终位置」的关系。

第 1 趟可以确定 1 个最终位置,就是「基准数」的位置。

第 2 趟开始,分两种情况:

  1. 如果前 1 趟比较倒霉,基准数选中了未排序数字中的最小值或者最大值,那么 left 和 right 只存其一,本趟还是只能确定 1 个基准位置
  2. 第二种情况就比较正常了,前 1 趟的基准数在数组里靠中间的位置,那么可以在 left 和 right 中分别再确定 1 个基准位置,本趟一共能确定 2 个基准位置

所以,第 3 趟完成后,确定了多少最终位置呢?—— 最少 3 个,最多 5 个。

其实是有可能大于 5 个的,有些数在交换的过程中,可能凑巧落在了最终位置上,但这不影响解题

基于上面的分析,咱们来看看题目中的选项,落在最终位置的数字用「加粗红色」标了出来(显然,最终排序结果是 4, 6, 8, 10, 12, 14, 16):

  • A:4, 8, 6, 10, 12, 16, 14
  • B:10, 4, 6, 8, 12, 14, 16
  • C:8, 4, 6, 12, 10, 14, 16
  • D:4, 8, 6, 12, 10, 16, 14

C 和 D 不可能,小于 3 个最终位置。

B 可能,B 属于上面说的最倒霉情况,基准数每次都选了最大值。

A 稍微复杂一些,但按上面的思路分析:

  • 如果第 1 趟确定的是 4 的最终位置,第 3 趟完成后只确定了 3 个最终位置(4、10、12),那只能和 B 类似,最终位置集中在数组两端
  • 如果第 1 趟确定的是 10 或者 12 的最终位置,第 3 趟后不可能只存在 3 个最终位置

所以 A 不可能

综上:答案是 A、C、D