#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小数