在快速排序的过程中进行操作,快速排序定下的某个数排序结束之后可以得到当前数是第几个数,然后根据得到的第几个数可以进行向左还是向右的调整。
可以省略掉一些不必要的操作。
#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;
}

京公网安备 11010502036488号