- 快排思想的运用。因为快排每次可以确定一个元素的最终位置,那么只要确定了第k个数字的位置,递归就可以结束了。
// 第k个数
#include <iostream>
using namespace std;
const int N = 100010;
int n, k, a[N];
int quickFind (int l, int r, int k) {
// 1. 前半部分和快排完全相同: 找到第k个位置了
if (l == r ) return a[r];
// 1.1 以x为枢轴,一次快排的内容
int i = l - 1, j = r + 1, x = a[l + r >> 1];
while (i < j) {
// do i++; while (a[i] < x);
while (a[++i] < x);
//do j--; while (a[j] > x);
while (a[--j] > x);
if (i < j) swap(a[i], a[j]);
}
// 2. 左半边的长度
int SL = j - l + 1;
// 2.1 左半边太长了,去左半边找
if (SL >= k ) return quickFind(l, j, k);
// 2.2 左半边太短了,去右边找,此时只要去找第K-SL数
else return quickFind(j + 1, r, k - SL);
}
int main() {
// 3. 输入n,k,初始化数组
cin >> n >> k;
for (int i = 0; i < n; i++) cin >> a[i];
// 4.直接打印出第k个数
cout << quickFind(0, n - 1, k) << endl;
return 0;
}