假设输入数据是互异的。Randomized_Select算法以快速排序算法为模型,可以求一个数组中第k小的元素。与快速排序不同的是,快速排序会递归处理划分的两边,而Randomized_Select只处理划分的一边,期望运行时间为O(n)。
#include <iostream>
#include <random>
using namespace std;
int Random(int p,int r){
uniform_int_distribution<unsigned> u(p,r);
default_random_engine e;
return u(e);
}
int Randomized_Partition(int *array,int p,int r){
swap(array[Random(p,r)], array[r]);
int x = array[r];
int i = p - 1;
for (int j = p; j < r; ++j){
if (array[j] < x){
i++;
swap(array[i], array[j]);
}
}
swap(array[i + 1], array[r]);
return i + 1;
}
int Randomized_Select(int *array, int p, int r, int i){
if (p == r)
return array[p];
int q = Randomized_Partition(array, p, r);
int k = q - p + 1;
if (k == i)
return array[q];
else if (k > i)
return Randomized_Select(array, p, q - 1, i);
else
return Randomized_Select(array, q + 1, r, i-k);
}