这是一个典型的选择问题,这里我们采用分治算法 RandomizedSelect,其渐近运行时间为Θ(n)。这里我们与快排类似,对数组进行递归划分,但与快速排序不同的是,快速排序会递归处理划分的两边,而 RandomizedSelect 只处理划分的一边。
template<typename T>
int partitionArray(T arr[], int low, int high)
{
T pivot = arr[high];
int i = low - 1;
for(int j = low; j < high; ++j)
if(arr[j] <= pivot)
std::swap(arr[++i], arr[j]);
std::swap(arr[++i], arr[high]);
return i;
}
template<typename T>
int randomizedPartition(T arr[], int low, int high)
{
std::default_random_engine random(time(nullptr));
std::uniform_int_distribution<int> dis(low, high);
int i = dis(random);
std::swap(arr[i], arr[high]);
return partitionArray(arr, low, high);
}
template<typename T>
T randomizedSelect(T arr[], int low, int high, int i)
{
if(low == high)
return arr[low];
int mid = randomizedPartition(arr, low, high);

这篇博客介绍了如何使用C++实现分治算法中的RandomizedSelect方法,来解决寻找数组中第i小元素的问题。这种方法在平均情况下具有线性时间复杂度,类似于快速排序的划分过程,但只对划分后的一侧进行递归操作。
最低0.47元/天 解锁文章
1191

被折叠的 条评论
为什么被折叠?



