#include <vector>
#include <cstdlib>
using namespace std;
/*
* 快速选择, O(n) 时间 找到无序数组 第n大的数字
*/
int partition(vector<int> &nums, int l, int r){
// 随机选择作为主元的那个元素
int rand_idx = rand() % (r-l+1) + l;
swap(nums[l], nums[rand_idx]);
int less = l, pivot = nums[l];
for (int i = l + 1; i <= r; i++){
if (nums[i] < pivot)
swap(nums[i], nums[++less]);
}
swap(nums[l], nums[less]);
return less;
}
int quick_select(vector<int> &nums, int n){
if(n<=0 || nums.size() < n)
return -1;
n = n -1; // 转为下标
int l = 0, r = nums.size()-1;
int idx = partition(nums, l, r);
while (idx != n)
{
if (n < idx)
r = idx-1;
else
l = idx + 1;
idx = partition(nums, l, r);
}
return nums[idx];
}
快速选择(O(n),找到无序数组任意第k大的数字)
最新推荐文章于 2022-06-08 16:03:48 发布
本文深入讲解了快速选择算法,一种平均时间复杂度为O(n)的高效算法,用于寻找无序数组中第n大的元素。通过随机化分区过程,算法确保了良好的平均性能。文章详细解释了算法的实现细节,并提供了完整的C++代码示例。

5万+

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



