选择算法(顺序统计量)
文章目录
引入
在计算机科学中,选择算法是一种在列表或数组中找到第 k k k个最小数字的算法。这样的数字被称为第 k k k个顺序统计量。
我们可以使用排序算法在 O ( n log 2 n ) O(n\log_2n) O(nlog2n)时间内解决这个问题。但还有一种更快的方法可以在 O ( n ) O(n) O(n)的期望时间内解决这个问题。
期望为线性时间O(n)的算法
这个方法和快速排序类似,我们需要将输入的数组进行划分,与快速排序不同的是,快速排序会递归地处理划分完后的两边,而这个方法只处理一边。因此,期望时间为 O ( n ) O(n) O(n)(这取决于划分操作是否能更平分输入数组),我们将这个算法称为选择算法。
划分操作
图片来自算法导论,核心思想是将输入数组分为 4 4 4个部分进行操作。将输入数组的最后一个元素作为 p i v o t pivot pivot。
然后剩下三部分,第一部分为小于等于 p i v o t pivot pivot,第二部分大于 p i v o t pivot pivot,第三部分为待划分的区域。
这是C++的实现代码:
#include <algorithm>
#include <iterator>
template <typename RandIt>
inline RandIt partition(RandIt first, RandIt last) {
if (first == last) {
return first;
}
std::advance(last, -1); // pivot
for (RandIt it = first; it != last; std::advance(it, 1)) {
if (*it <= *last) {
std::iter_swap(