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