- 问题
设L是n个元素的集合,从L中选取第k小的元素,其中1<=k<=n。
这里第k小的元素是指,当L按从小到大排好序之后,排在第k个位置的元素。
利用特定分治策略选出第k小的元素。
- 解析
- 设计
输入: n个数的数组S,正整数k
输出: S中的第k小元素
1.将S划分成5个一组,共「n/5」个组
2. 每组找一个中位数,把这些中位数放到集合M中
3. m°←Select(M,[|M|/27)
4.把A和D中的每个元素与m*比较,小的构成S1,大的构成S2;
5. S1←S1UC; S2←S2∪B;
6. if k=|S1|+1 then输出m
7.else if k≤|S1|
8.then Select(S1, k)
9.else Select(S2,k-|S1|-1)
- 分析
5.代码
typedef pair<int, int> pairs;
int Select(vector<int> a, int k)
{
int temp1 = a.size();
vector<int>::iterator iter = a.begin();
if(temp1 < 5){
sort(iter, iter + temp1);
return *(iter + k - 1);
}