#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
int a[100010]={0};
int kuai(int a[],int l,int r){//快速排序
int tmp,i,j,p;
//p=rand()%(r-l+1)+l;j=a[p];a[p]=a[l];a[l]=j;
//随机选择防止最坏复杂度!
p=(int)round(1.0*rand()/RAND_MAX*(r-l)+l);
//考虑数组a范围超过32767情况!
swap(a[p],a[l]);
tmp=a[l];
while(l!=r){
while(l!=r&&a[r]>tmp)
r--;
a[l]=a[r];
while(l!=r&&a[l]<=tmp)
l++;
a[r]=a[l];
}
a[l]=tmp;
return l;//返回相遇的下标!
}
int srandele(int a[],int l,int r,int k){
if(l==r) return a[l];//边界;
int p=kuai(a,l,r);
int m=p-l+1;
if(k==m) return a[p];
if(k<m) return srandele(a,l,p-1,k);
else
return srandele(a,p+1,r,k-m);
}
int main(){
srand((unsigned)time(NULL));
int i,k,m,n;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
printf("%d",srandele(a,0,n-1,n-m+1));
return 0;
}
随机选择算法选择第k大数
最新推荐文章于 2020-09-13 20:12:53 发布