选择算法(顺序统计量)

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

选择算法(顺序统计量)

引入

在计算机科学中,选择算法是一种在列表或数组中找到第 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值