采用快排的思想。
用快排对数组排序之后,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
}
}


京公网安备 11010502036488号