选择算法

1.问题描述

在一个由n个元素组成的集合中,第i顺序统计量是该集合中第i小的元素。例如:在一个元素集合中,最小值是第1个顺序统计量,最大值是第n个顺序统计量。用非形式化的描述来说,一个中位数是它所属集合的“中点元素”。当n为奇数时,中位数是唯一的,位于i = (n + 1) / 2处。当n为偶数时,存在两个中位数,分别位于i=n/2i = n/2+1处。

输入:一个包含n个(互异的)数的集合A和一个整数i, 1 <= i <= n。
输出:元素x属于A,且A中恰好有i-1个其他元素小于它。

2.算法实现

选择算法-伪代码:

FUNCTION Randomized_Select(A, p, r, i)
if p == r
    return A[p]
q = Randomized_Partition(A, p, r)
k = q - p + 1
if i == k
    return A[q]
else i < k
    return Randomized_Select(A, p, q-1, i)
else return Randomized_Select(A, q+1, r, i-k)

随机划分-伪代码:

FUNCTION Randomized_Partition(A, p, r)
q = random(p, r)
exchange A[r] with A[q]
q = p - 1
for i = p to r-1
    if A[r] < A[i]
        q = q + 1
        exchange A[i] with A[q]
exchange A[q + 1] with A[r]
return q + 1  
  • 第2-3行检查递归的基本情况,即A[p..r]中只包含一个元素。
  • 第4行调用Randomized_Partition,将数组随机划分为两个子数组A[p..q-1]A[q+1..r],使得A[p..q-1]中的每个元素都小于等于A[q],而A[q]小于A[q+1..r]中的每个元素。
  • 第5行计算A[p..q]中元素的个数k。
  • 第6-7行检查A[q]是否是第i小的元素。
  • 第8-10行要确定第i小的元素落在两个子数组A[p..q-1]A[q+1..r]的哪一个之中。第8-9行在低区的子数组中进一步递归查找,第10行在高区的子数组中递归查找。

该算法的期望运行时间为O(n)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值