期望为线性时间的选择算法

《算法导论》第3版9.2提到了期望为线性时间的选择算法
randomized_select 算法是以第7章的快速排序算法为模型的。
与快速排序一样,我们仍然将输入数组进行递归划分。
但与快速排序不同的是,快速排序会递归处理划分的两边,
而 randomized_select 只处理划分的一边。

数组 A[p..r] 被划分为两个子数组 A[p..q-1] 和 A[q+1..r]
使得 A[p..q-1] 中的每个元素都小于或等于 A[q],A[q+1..r] 中的每个元素都大于 A[q]
第4行计算 A[p..r] 的元素个数count,即处于划分的低区的元素的个数加1。
然后第5行检查 A[q] 是否是第 k 小的元素。如果是,就返回 A[q]
否则,算法要确定第 k 小的元素落在两个子数组 A[p..q-1] 和 A[q+1..r] 的哪一个之中。
如果 k < count,则在低区,如果 k > count,则在高区。然后递归查找。

代码如下

int partition(int A[], int p, int r)
{
    int x = A[r];
    int i = p - 1;

    
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值