在快速排序的过程中进行操作,快速排序定下的某个数排序结束之后可以得到当前数是第几个数,然后根据得到的第几个数可以进行向左还是向右的调整。
可以省略掉一些不必要的操作。
#include <bits/stdc++.h>

using namespace std;
const int maxn = 5e6+10;
int a[maxn];
int k;
inline int read() {
    int x=0, f=1;
    char ch = getchar();
    while (ch<'0'||ch>'9') {
        if (ch == '-') 
            f = -f;
        ch = getchar();
    }
    while (ch >= '0' && ch<='9') {
        x = (x<<1) + (x<<3) + (ch^48);
        ch = getchar();
    }
    return x*f;
}

int quick_find(int l, int r) {
    if (l==r) return a[l];
    int i=l, j=r;
    int temp = a[(i+j)/2];
    while (i<=j) {
        while (a[i]<temp) i++;
        while (a[j]>temp) j--;
        if (i<=j) {
            swap(a[i], a[j]);
            i++;
            j--;
        }
    }
    if (k<=j) return quick_find(l, j);
    else if (k>=i) return quick_find(i, r);
    else return a[k];
}

int main() {
    int T;
    T = read();
    while (T--) {
        int n = read();
        k = read();
        for (int i=1;i<=n;i++) {
            a[i] = read();
        }
        cout<<quick_find(1, n)<<endl;
    }
    
    return 0;
}