选择算法(顺序统计量)
文章目录
引入
在计算机科学中,选择算法是一种在列表或数组中找到第 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(first,

选择算法在计算机科学中用于查找列表或数组中的第k个最小数字,即第k个顺序统计量。该算法在期望O(n)的时间内运行,类似于快速排序,但仅处理划分后的一边。通过划分操作将数组分为四部分,并使用C++实现来找到第n个元素。测试显示其运行速度比C++标准库的std::nth_element稍快。
最低0.47元/天 解锁文章
6164

被折叠的 条评论
为什么被折叠?



