总结:这一章讲了找最大值、最小值的方法,介绍了以期望线性时间找第i小的数的方法,以及以最坏情况线性时间找第i小的数的方法。
1. 最大值和最小值
找最小值,遍历一遍即可
伪代码
MINIMUM(A)
min <- A[1]
for i <- 2 to length[A]
do if min > A[i]
then min <- A[i]
return min
若要同时比较最大值和最小值,可以设两个变量max, min,再将A两两一对,先两个比对一下,将小的与min比较,大的与max比较,这样比较次数最多是3[n/2]
2. 以期望线性时间做选择
利用快排中的RANDOMIZED-PARTITION, 它返回A中的第i小的元素
算法分析:平均情况下O(n),最坏情况O(n^2)
伪代码
RANDOMIZED-SELECT(A, p, r, i)
if p=r
then return A[p]
q <- RANDOMIZED-PARTITION(A, p, r)
k <- q-p+1
if i=k
then return A[q]
elseif i<k
then return RANDOMIZED-SELECT(A, p, q-1, i)
else
return RANDOMIZED-SELECT(A, q+1, r, i-k)
3. 以最坏情况线性时间做选择
算法SELECT,最坏情况运行时间O(n)
执行步骤:
1) 将输入数组的n个元素划分为[n/5]组,每组5个元素,且至多只有一个组由剩下的n mod5个元素组成。
2) 寻找[n/5]个组中每一组的中位数。首先对每组中的元素进行插入排序,然后从排序过的序列中选出中位数。
3) 对第2步中找出的[n/5]个中位数,递归调用SELECT以找出其中位数x
4) 利用修改过的PARTITION过程,按中位数的中位数x对输入数组进行划分。设x是第k小的元素。
5) 如果i=k,则返回x。否则,如果i<k,则在低区递归调用SELECT以找出第i小的元素,如果i>k,则在高区递归调用SELECT以找出第i-k个最小元素。