运行时间为θ(n)
#include <cstdlib>
#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
void input(vector<int>& v)
{
int data;
while(cin>>data)
{
v.push_back(data);
}
}
int partition(vector<int> &v,int s,int e) //每次都随机选择一个元素,并和最后一个元素交换
{
srand((unsigned int)time(NULL));
int p=rand()%(e-s+1)+s;
int temp=v[p];
v[p]=v[e];
v[e]=temp;
int insert_u=s-1;
for(int i=s;i<e;++i)
{
if(v[i]<v[e])
{
int temp=v[++insert_u];
v[insert_u]=v[i];
v[i]=temp;
}
}
temp=v[e];
v[e]=v[++insert_u];
v[insert_u]=temp;
return insert_u;
}
int RandomSelect(vector<int> &v,int p,int r,int i)
{
if(p==r)
return v[p];
int q=partition(v,p,r);
int k=q-p+1;
if(i==k) //找到了第i个顺序统计量
return v[q];
else if(i<k)
return RandomSelect(v,p,q-1,i);
else
return RandomSelect(v,q+1,r,i-k);
}
int main(int argc, char *argv[])
{
vector<int> v;
input(v);
cin.clear();
cin.sync();
cout<<"input you want to select:";
int i;
cin>>i;
int res;
res=RandomSelect(v,0,v.size()-1,i);
cout<<res<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}