//从n个数中查找最大的k个数,method1 //时间复杂度O(N*log(K)) #include<iostream> #include<vector> using namespace std; void f(int k,vector<int>& v,vector<int>& sa,vector<int>& sb){//v输入数组,sa比x大的数的数组,sb比x小的数组。 while(1){ int x=v[(int)(v.size()*((double)rand()/RAND_MAX))];//随机从vector v中找个数 for(int i=0;i<v.size();i++){ int tp=v[i]; if(tp>=x){//比x大就放到sa中,小就放到sb中 sa.push_back(tp); } else{ sb.push_back(tp); } } if(sa.size()>k){//如果sa的个数大于k,就从sa中找k个数 v=sa; sa.clear();sb.clear(); continue; } else{ if(sa.size()==k){//如果sa的个数等于k,就输出k个数 for(int i=0;i<sa.size();i++){ cout<<sa[i]<<" "; } cout<<endl;break; } else{ for(int i=0;i<sa.size();i++){//如果sa个数少于k个,就输出这|sa|个数,并从sb中找k-|sa|个数 cout<<sa[i]<<" "; } v=sb;k=k-sa.size(); sa.clear();sb.clear(); continue; } } } } void print(int i){ cout<<i<<" "; } int main(){ vector<int> v;int n; cout<<"input n"<<endl;cin>>n; for(int i=0;i<n;i++){//生成随机的n个数,范围是[0,99] int tp=rand()%100; v.push_back(tp); } for_each(v.begin(),v.end(),print);cout<<endl; //输出这些数 cout<<"input k\n"; int k;cin>>k; vector<int> sa,sb; f(k,v,sa,sb);//调用上面的函数 system("pause"); }
编程之美2.5查找最大的k个数的实现<method1>
最新推荐文章于 2024-09-15 17:30:17 发布