在一个由n个元素组成的集合中,第i个顺序统计量是该集合中第i小的元素。
9.1 最小值和最大值
找最小值:依次查看集合中的每个元素,并记录比较过程中的最小元素。
同时找出最小值和最大值:先将一对输入元素互相比较,然后把较小者与当前最小值比较,把较大者与当前最大值比较,因此每两个元素需要3次比较,总的比较次数为3[n/2]。
9.2 以期望线性时间做选择
分治算法RANDOMIZED-SELECT:以快速排序算法为模型,对输入数组进行递归划分。和快速排序不同的是,快速排序会递归处理划分的两边,而RANDOMIZED-SELECT只处理划分的一边。
C代码:
最坏情况运行时间为θ(n^2),平均情况为O(n)。
9.3 最坏情况线性时间的选择
选择算法SELECT,最坏情况运行时间为O(n)。该算法的基本思想是在RANDOMIZED-SELECT基础上,保证每次对数组的划分都是个好的划分。
执行步骤:
1)将输入数组的n个元素划分为n/5组,每组5个元素,且至多只有一个组由剩下的n mod 5个元素组成。
2)寻找n/5个组中每一个组的中位数。
3)对第2步中找出的n/5个中位数,递归调用SELECT以找出其中位数x。
4)按中位数x对输入数组进行划分。
该算法也被称为 Median of Medians algorithm。当按照该算法找出中位数的中位数x后,可以保证至少有30%个元素小于x,有30%个元素大于等于x。