采用快排的思想。
用快排对数组排序之后,0-j的区间内的数都是<=x的,i-r的区间内的数都是>=x的,然后判断k在那个区间内,在对这个区间进行快排。

#include <iostream>
using namespace std;
const int maxn = 5000010;
int arr[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 finding(int l, int r, int k)
{
    if (l == r) return arr[l];
    int i = l, j = r;
    int mid = (l + r) >> 1;
    int x = arr[mid];
    while (i <= j)
    {
        while (arr[j] > x) j--;
        while (arr[i] < x) i++;
        if (i <= j)
        {
            swap(arr[i], arr[j]);
            i++, j--;
        }
    }
    if (k <= j) return finding(l, j, k);
    else if (k >= i) return finding(i, r, k);
    else return arr[k];
}
int main()
{
    int T;
    cin >> T;
    while (T--) {
        int num1, num2;
        num1 = read();
        num2 = read();
        for (int i = 0; i < maxn; i++) {
            arr[i] = 0;
        }
        for (int i = 0; i < num1; i++) {
            arr[i] = read();
        }
        cout<<finding(0, num1 - 1, num2-1)<<endl;//因为数组下边从零开始,所以num2要-1
    }
}