#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=5000005;
int a[maxn];
void quickSelect(int a[],int l,int r,int rank)
{
int i=l,j=r,mid=a[(l+r)>>1];
do{
while(a[i]<mid) ++i;
while(a[j]>mid) --j;
if(i<=j){
swap(a[i],a[j]);
++i;
--j;
}
}while(i<=j);
if(l<=j && rank<=j-l+1) quickSelect(a,l,j,rank);
if(i<=r && rank>=i-l+1) quickSelect(a,i,r,rank-(i-l));
}
int quick_select(int a[],int n,int k)//第k小
{
quickSelect(a,1,n,k);
return a[k];
}
inline int read(){
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if (ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = (x<<1) + (x<<3) + (ch^48);
ch = getchar();
}
return x * f;
}
int main()
{
int t;
t=read();
while(t--)
{
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++)
a[i]=read();
cout<<quick_select(a,n,k)<<endl;
}
return 0;
}
这里使用简单sort会直接tle,所以这里采用了分治快排思想求解第k小数

京公网安备 11010502036488号