Input:输入包含n个元素的序列,k
Output:第k小的元素
#include <iostream>
#include <algorithm>
using namespace std;
//快速选择算法
int n, k, a[100001];
//k:第k个元素的绝对位置
int quick_select(int l, int r, int k) {
if (l < r) {
int i = l, j = r, x = a[(l + r) / 2];
while (i <= j) {
while (a[i] < x)
i++;
while (a[j] > x)
j--;
if (i <= j) {
swap(a[i], a[j]);
i++; j--;
}
}
//特判i+2==j并且k恰好在j+1的位置的情况
if (j + 2 == i && k == j + 1) {
return a[k];
}
if (k <= j) {
return quick_select(l, j, k);
}
else {
return quick_select(i, r, k);
}
}
return a[l];
}
int main()
{
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
cout << quick_select(1, n, k);
return 0;
}