时间限制:C/C++ 3秒,其他语言6秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
给你一个长度为n的序列,求序列中第k小数的多少。
输入描述:
多组输入,第一行读入一个整数T表示有T组数据。
每组数据占两行,第一行为两个整数n,k,表示数列长度和k。
第二行为n个用空格隔开的整数。
输出描述:
对于每组数据,输出它的第k小数是多少。
每组数据之间用空格隔开
输入:
2
5 2
1 4 2 3 4
3 3
3 2 1
输出:
2
3
思路:快排思想,假设第n次排序的中间基准数字是a,排完后就在准确位置,若是第k位直接返回,若k在基准前面,在l和mid继续排。
建议去看一遍快排就ok了。
//快排思想
//快读
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int arr[5000005];
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 qs(int l,int r,int k)
{
if(l==r) return arr[l];
int mid=(l+r)>>1;
int x=arr[mid];
int i=l,j=r;
while(i<=j)
{
while(arr[i]<x) i++;
while(arr[j]>x) j--;
if(i<=j)
{
swap(arr[i],arr[j]);
i++;j--;
}
}
if(k<=j) return qs(l,j,k);
else if(k>=i) return qs(i,r,k);
else return arr[k];
}
int main()
{
int T;
T=read();
while(T--)
{
int n,k;
n=read();k=read();
int i;
for(i=1;i<=n;i++) arr[i]=read();
cout<<qs(1,n,k)<<endl;;
}
}