在快排的基础上,比较k与一次排序后左区间的个数,确定第K个数所在的区间,然后只递归该区间即可。若在右区间,则是第k - L 个数(L是左区间个数
#include<iostream>
using namespace std;
const int N = 100010;
int q[N];
int quick_check(int l, int r, int k)
{
if (l >= r) return q[r];// 不能返回q[k]
int i = l - 1, j = r + 1, x = q[l + r >> 1];
while(i < j)
{
while (q[++ i] < x);
while (q[-- j] > x);
if (i < j) swap(q[i], q[j]);
}
int L = j - l + 1;
if (k <= L) return quick_check(l, j, k);
else return quick_check(j + 1, r, k - L);
}
int main()
{
int n, k;
cin >> n >> k;
for (int i = 1;i <= n; i ++) cin >> q[i];
cout << quick_check(1, n , k);
return 0;
}