第k小数

题目描述 

给你一个长度为n的序列,求序列中第k小数的多少。

输入描述:

多组输入,第一行读入一个整数T表示有T组数据。
每组数据占两行,第一行为两个整数n,k,表示数列长度和k。
第二行为n个用空格隔开的整数。

输出描述:

对于每组数据,输出它的第k小数是多少。
每组数据之间用空格隔开
 
输入:

2
5 2
1 4 2 3 4
3 3
3 2 1

输出:

2
3

链接:https://ac.nowcoder.com/acm/contest/5773/A
来源:牛客网

备注:

t≤10,1≤n≤5×106,k≤n,数列里每个数都在int范围内t \leq10 , 1\leq n\leq5\times 10^6,k\leq n,数列里每个数都在int范围内t10,1n5×106,kn,int
由于输入比较多,请使用快读读取。
例如:
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;
}
 
 
 
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const double eps = 1e-10;
const int maxn = 5e6 + 10;

int a[maxn];
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 qsort(int l,int r)   //a[]代表无序数组,l代表左边界,r代表右边界

{

    int x = a[l],i = l,j = r;     //i,j一开始分别指向左右边界,并将做边界的数值记录下
    while(i < j)
    {
        while(i < j && a[j] >= x)
            j--;    //从右边界开始判断,如果大于x值,j往左移,如果遇见小于的话,跳出循环
        a[i] = a[j];                     //跳出循环后,将后面小于x的值,移动到前面去
        while(i < j && a[i] <= x)
            i++;
        a[j] = a[i];
    }

    a[i] = x;                //当i=j时,将x的值赋值到a[i]上去,这时比x小的都在左边,比x大的都在右边

    return i;

}
void find(int l,int r,int k)
{
    int t=qsort(l,r);
    if(k==t)
    {
        cout<<a[k]<<endl;
        return;
    }
    else if(k-1<t)
    {
        find(l,t-1,k);
    }
    else
        find(t+1,r,k);
}


int main()
{
    int T;
    T=read();
    int n,k;

    while(T--)
    {
        n=read();
        k=read();
        for(int i=1; i<=n; i++)
        {
            a[i]=read();

        }
        find(1,n,k);

    }
    return 0;
}

  

 

 

 

posted @ 2020-07-16 19:34  QingJia  阅读(294)  评论(0)    收藏  举报