选第K小元素:特定分治策略
1. 问题
用特定分治算法找出数组中第k大的元素
2. 解析
分:将整个数组分为若干相等的块,各个块排序后找到其中位数。再将各个块的中位数集合,形成一个新数组,再次分块,不断分治后得到最终的中位数m。
治:找到m后,将原数组划分为3个组A1,A2,A3,分别包含小于,等于,大于m的元素。这样可以得到3中情况:
若A1的元素数量大于等于K,即第K个元素在第一组内:在A1中递归查找第k小元素。
若A1、A2元素个数之和大于等于K,即中项m为第K个元素。返回m。
第K个元素在第三组:在A3中递归寻找第(k-|A1、A2元素数量之和|)小元素。
3. 设计
Select(S,k)
输入:n个数的数组S,正整数k
输出:S中的第k小元素
1.将S划分成5个一组,共ceil(n/5)个组
2.每组找一个中位数,把这些中位数放到集合M中
3.m*<-Select(M,ceil(|M|/2))
4.把A和D中的每个元素与m比较,小的构成S1,大的构成S2
5.S1<-S1∪C;S2<-S2∪B;
6.if k=|S1|+1 输出m
7.else if k<=|S1|
Select(S1,k)
else Select(S2,k-|S1|-1)