中位数和顺序统计量
在一个由n个元素组成的集合中,第i个顺序统计量(order statistic)是该集合中第i小的元素。min是第一个,max是第n个。
9.1 最小值和最大值
MINIMUM(A)
min=A[1]
for i=2 to A.length
if min>A[i]
min=A[i]
return min
可以同时找到最小值和最大值,首先将一对输入元素相互进行比较,然后把较小的与当前的最小值比较,把较大的与当前最大值进行比较,这样对每两个元素共需要3次比较。
9.2 期望为线性时间的选择算法
一般选择问题看起来要比找最小值这样的问题困难很多,但它们的渐进运行时间却都是O(n)。
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 //the pivot value is the answer
return A[q]
else if i
9.3 最坏情况为线性时间的选择算法
我们来看一个最坏情况运行时间为O(n)的选择算法。像RANDOMIZED-SELECT一样,SELECT算法通过对输入数组的递归划分来找出所需元素,但是在该算法中能够保证得到对数组的一个好的划分。SELECT使用的也是来自快速排序的确定性划分算法PARTITION,但做了修改,把划分的主元也作为输入参数。
通过执行下列步骤,算法SELECT可以确定一个有n>1个不同元素的输入数组中第i小的元素。
1. 将输入数组的n个元素划分为n/5组,每组5个元素,且至多只有一组由剩下的n mod 5个元素组成;
2. 寻找这n/5组中每一组的中位数:首先对每组元素进行插入排序,然后确定每组有序元素的中位数;
3. 对第2步中找出的n/5个中位数,递归调用SELECT以找出其中位数x(如果有偶数个中位数,为了方便,约定x是较小的中位数);
4. 利用修改过的PARTITION版本,按照中位数的中位数x对输入数组进行划分。让k比划分的低区中的元素数目多1,因此x是第k小的元素,并且有n-k个元素在划分的高区;
5. 如果i=k,则返回x。如果i