选择算法(2016年408真题最优解思路)

99 阅读1分钟

nn 个数构成的集合中,找到第 kk 小数。

  1. k=1k=nk = 1 \cup k=n 时分别为最小,最大值,其时间复杂度为 O(n)O(n)
  2. k1knk\neq1 \cap k \neq n 时,通过随机化,其时间复杂度期望同样为 O(n)O(n)
#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;
}