1.O(nlogk):
vector<int> topK(vector<int> a,int k)
{
vector<int> res(k);
for(int i=0;i<k;++i)res[i]=a[i];
make_heap(res.begin(),res.end(),greater<int>()); //最小堆
for(int i=k;i<a.size();++i)
{
if(a[i]>res[0])
{
res[0]=a[i];
make_heap(res.begin(),res.end(),greater<int>());
}
}
return res;
}
2.O(n):
int partition(int *A,int p,int r)
{
int x=A[r],i=p-1;
for(int j=p;j<r;j++)
{
if(A[j]>=x)swap(A[++i],A[j]);
}
swap(A[i+1],A[r]);
return i+1;
}
void topK(int *A,int n,int k)
{
int start=0,end=n-1,index=partition(A,start,end);
while(index!=k-1)
{
if(index>k-1)
{
end=index-1;
index=partition(A,start,end);
}
else
{
start=index+1;
index=partition(A,start,end);
}
}
}