可以在O(n)的期望时间内找到输入数据中第i大的数,不依赖于输入数据,最坏运行时间O(n^2)
#include<iostream>
using namespace std;
template<class T>
int RandomizedPartition(T A[],int p, int r)
{
int i = rand()%(r-p+1)+p;
swap(A[i],A[r]);
T x = A[r];
i = p-1;
for(int j=p;j<=r-1;j++)
{
if(A[j]<= x)
{
++i;
swap(A[i],A[j]);
}
}
swap(A[r],A[i+1]);
return i+1;
}
template<class T>
T RandomizedSelect(T A[],int p, int r, int i)//选择数组中第i大的数
{
if(p == r)
return A[p];
int q = RandomizedPartition(A,p,r);
int k = q-p+1;
if(i==k)
return A[q];
else if(i<k)
return RandomizedSelect(A,p,q-1,i);
else
return RandomizedSelect(A,q+1,r,i-k);
}
int main()
{
int a[] = {12,512,235,12,12,5,43,8,56,2,1,41,4,14,15,1,1123};
for (int i=1;i<=sizeof(a)/sizeof(int);i++)
cout << RandomizedSelect(a,0,sizeof(a)/sizeof(int)-1,i) << endl;
system("pause");
return 0;
}