Quickselect
概述
Quickselect(RANDOMIZED-SELECT)是由 Hoare 于 1961 年发明的随机化选择算法。它基于快速排序的 PARTITION 操作,但只递归处理一侧子数组,期望运行时间为 ,最坏情况为 。
定义
Quickselect(RANDOMIZED-SELECT)
RANDOMIZED-SELECT 在子数组 中找到第 小的元素:
- 若 ,则返回 (基础情形)。
- 随机选择一个主元 。
- (主元是第 小的元素)。
- 若 ,返回 (恰好是主元)。
- 若 ,在左子数组递归:RANDOMIZED-SELECT。
- 若 ,在右子数组递归:RANDOMIZED-SELECT。
核心性质
- 只递归一侧:与快速排序不同,Quickselect 每次只递归处理包含目标元素的那一侧,因此期望时间复杂度为 (而非 )。
- 期望线性时间:期望递归式为 ,由主定理可得 。
- 最坏情况:当每次 PARTITION 都产生极度不平衡的划分时(如每次主元都是最小或最大),退化为 。
- 原地算法:不需要额外空间,空间复杂度为 (迭代版本)或 (递归栈)。
- 实际应用:C++ STL 中的
std::nth_element通常基于 Quickselect 或其变体实现。
章节扩展
第9章:中位数与序统计
- 9.2 期望线性时间选择 RANDOMIZED-SELECT 的完整描述与分析。