算法思想:使用快排中的思想,随机从数组中选择一个元素x,将数组元素分成两部分Sa和Sb,其中Sa>x,Sb<=x,这时,有两种可能性:
1. Sa中元素个数小于K,Sa中所有的数和Sb中最大的K-length(Sa),就是S中最大的K个数;
2. Sa中元素个数大于或者等于K,则需要返回Sa中最大的K个数。
不断进行递归,能够得到问题的解。
//寻找最大的K个数
#include<iostream>
#include<vector>
using namespace std;
vector<int> v;
int a[]={88,67,75,105,67,109,34,59,70,90,109,43,39,95};
struct Node{
vector<int> v1,v2;
};
Node Partition(vector<int> v){
vector<int> a;
vector<int> b;
int tmp_i=rand()%v.size();
int tmp=v[tmp_i];
v[tmp_i]=v[0];
v[0]=tmp;
int p=v[0];
for(int i=1;i<v.size();i++){
if(v[i]>p){
a.push_back(v[i]);
}else{
b.push_back(v[i]);
}
}
if(a.size()<b.size()){
a.push_back(p);
}else
b.push_back(p);
Node nd;
nd.v1=a;
nd.v2=b;
return nd;
}
vector<int> Kbig(vector<int> v,int k){
if(k<=0){
vector<int> tmp;
return tmp;
}
if(v.size()<=k)
return v;
Node n=Partition(v);
vector<int> sa=Kbig(n.v1,k);
vector<int> sb=Kbig(n.v2,k-sa.size());
for(int i=0;i<sb.size();++i){
sa.push_back(sb[i]);
}
return sa;
}
int main(){
int i;
for(i=0;i<sizeof(a)/sizeof(int);++i){
v.push_back(a[i]);
}
vector<int> res=Kbig(v,2);
for(i=0;i<res.size();++i)
cout<<res[i]<<endl;
return 0;
}