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

推荐订阅源

G
GRAHAM CLULEY
Cloudbric
Cloudbric
L
LINUX DO - 最新话题
W
WeLiveSecurity
人人都是产品经理
人人都是产品经理
S
Security Affairs
Google Online Security Blog
Google Online Security Blog
Attack and Defense Labs
Attack and Defense Labs
Google DeepMind News
Google DeepMind News
宝玉的分享
宝玉的分享
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
TaoSecurity Blog
TaoSecurity Blog
罗磊的独立博客
博客园 - Franky
有赞技术团队
有赞技术团队
V2EX - 技术
V2EX - 技术
博客园 - 聂微东
Hacker News - Newest:
Hacker News - Newest: "LLM"
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
阮一峰的网络日志
阮一峰的网络日志
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
美团技术团队
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Jina AI
Jina AI
The Cloudflare Blog
S
Secure Thoughts
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
小众软件
小众软件
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
雷峰网
雷峰网
S
Security @ Cisco Blogs
T
Troy Hunt's Blog
O
OpenAI News
博客园 - 司徒正美
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threat Research - Cisco Blogs
I
Intezer
T
Threatpost
Apple Machine Learning Research
Apple Machine Learning Research
H
Hacker News: Front Page
T
Tailwind CSS Blog
V
V2EX
Spread Privacy
Spread Privacy
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Security Archives - TechRepublic
Security Archives - TechRepublic
腾讯CDC
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Google DeepMind News
Google DeepMind News

Keenwon's Blog

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