在 个数构成的集合中,找到第 小数。
- 当 时分别为最小,最大值,其时间复杂度为
- 时,通过随机化,其时间复杂度期望同样为
#include <bits/stdc++.h>
using namespace std;
int a[10005], n, k;
int partition(int l, int r){
int pivot = a[r];
int i = l - 1;
for(int j = l; j <= r - 1; j ++) {
if(a[j] <= pivot) {
i ++;
swap(a[i], a[j]);
}
}
swap(a[i + 1], a[r]);
return i + 1;
}
int select(int l, int r, int k) {
int p = partition(l, r); // 确定了 a[p] 在数组中的位置
int i = p - l + 1; // 共 i 个数字
if(i == k) return a[p];
else if(i < k) return select(p + 1, r, k - i);
else return select(l, p - 1, k);
}
signed main(){
cin >> n >> k;
for(int i = 1; i <= n; i ++) cin >> a[i];
cout << select(1, len, k) << endl;
return 0;
}