给定一个长度为n(1≤n≤1,000,000)的无序正整数序列,以及另一个数k(1≤k≤1,000,000)(关于第k大的数:例如序列{1,2,3,4,5,6}中第3大的数是4。)
输入
第一行两个正整数m,n。
第二行为n个正整数。
输出
第k大的数。
样例输入
6 3 1 2 3 4 5 6
样例输出
4
#include <stdio.h>
const int max=100000;
int partition(int a[],int left,int right){
int temp=a[left];
while(left<right){
while(left<right&&a[right]<temp) right--;
a[left]=a[right];
while(left<right&&a[left]>=temp) left++;
a[right]=a[left];
}
a[left]=temp;
return left;
}
int randselect(int a[],int left,int right,int k){
if(left==right) return a[left];
int p=partition(a,left,right);
int m=p-left+1;
if(k==m) return a[p];
if(k<m){
return randselect(a,left,p-1,k);
}
else{
return randselect(a,p+1,right,k-m);
}
}
int main(){
int m,x,a[max];
scanf("%d%d",&m,&x);
for(int i=0;i<m;i++){
scanf("%d",&a[i]);
}
int b=randselect(a,0,m-1,x);
printf("%d\n",b);
return 0;
}