Quickselect

概述

Quickselect(RANDOMIZED-SELECT)是由 Hoare 于 1961 年发明的随机化选择算法。它基于快速排序的 PARTITION 操作,但只递归处理一侧子数组,期望运行时间为 ,最坏情况为

定义

Quickselect(RANDOMIZED-SELECT)

RANDOMIZED-SELECT 在子数组 中找到第 小的元素:

  1. ,则返回 (基础情形)。
  2. 随机选择一个主元
  3. (主元是第 小的元素)。
  4. ,返回 (恰好是主元)。
  5. ,在左子数组递归:RANDOMIZED-SELECT
  6. ,在右子数组递归:RANDOMIZED-SELECT

核心性质

  • 只递归一侧:与快速排序不同,Quickselect 每次只递归处理包含目标元素的那一侧,因此期望时间复杂度为 (而非 )。
  • 期望线性时间:期望递归式为 ,由主定理可得
  • 最坏情况:当每次 PARTITION 都产生极度不平衡的划分时(如每次主元都是最小或最大),退化为
  • 原地算法:不需要额外空间,空间复杂度为 (迭代版本)或 (递归栈)。
  • 实际应用:C++ STL 中的 std::nth_element 通常基于 Quickselect 或其变体实现。

章节扩展

第9章:中位数与序统计

参见