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

推荐订阅源

月光博客
月光博客
L
LangChain Blog
Jina AI
Jina AI
WordPress大学
WordPress大学
人人都是产品经理
人人都是产品经理
S
Secure Thoughts
T
The Exploit Database - CXSecurity.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 聂微东
小众软件
小众软件
Apple Machine Learning Research
Apple Machine Learning Research
C
Cyber Attacks, Cyber Crime and Cyber Security
Project Zero
Project Zero
T
Threat Research - Cisco Blogs
量子位
G
GRAHAM CLULEY
腾讯CDC
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
C
CERT Recently Published Vulnerability Notes
The Hacker News
The Hacker News
C
Cisco Blogs
Scott Helme
Scott Helme
Spread Privacy
Spread Privacy
宝玉的分享
宝玉的分享
V
V2EX
博客园 - 三生石上(FineUI控件)
T
Tor Project blog
P
Proofpoint News Feed
雷峰网
雷峰网
D
Darknet – Hacking Tools, Hacker News & Cyber Security
V
Vulnerabilities – Threatpost
PCI Perspectives
PCI Perspectives
博客园_首页
L
LINUX DO - 最新话题
IT之家
IT之家
有赞技术团队
有赞技术团队
博客园 - Franky
Hacker News: Ask HN
Hacker News: Ask HN
Last Week in AI
Last Week in AI
The Cloudflare Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
美团技术团队
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Security Archives - TechRepublic
Security Archives - TechRepublic
L
LINUX DO - 热门话题
AWS News Blog
AWS News Blog
S
Security Affairs
T
Tailwind CSS Blog

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