生成一个实现分治法实现查找给定数据的第k大的值 c++完整的代码
时间: 2024-10-13 18:13:52 浏览: 22
c++分治法求解众数问题
5星 · 资源好评率100%
在C++中,我们可以使用分治法实现快速找到一个数组中的第K大元素,这种方法通常用于排序算法(如快速选择)。下面是一个使用分治思想的简单快速选择算法示例:
```cpp
#include <iostream>
#include <vector>
// 交换两个元素
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
// 选择函数,返回数组中小于等于pivot索引的元素个数
int partition(std::vector<int>& nums, int low, int high) {
int pivot = nums[high]; // 选择最后一个元素作为基准
int i = (low - 1);
for (int j = low; j <= high - 1; j++) {
if (nums[j] > pivot) {
i++; // 增加计数器
swap(nums[i], nums[j]);
}
}
swap(nums[i + 1], nums[high]); // 将基准放到正确的位置
return i + 1;
}
// 快速选择主函数
int quickSelect(std::vector<int>& nums, int k, int low, int high) {
if (low == high) { // 如果只有一个元素或已经排序,直接返回
return nums[low];
}
int pivotIndex = partition(nums, low, high); // 找到基准位置
// 递归地在分割后的部分继续寻找第k大元素
if (k == pivotIndex)
return nums[pivotIndex];
else if (k < pivotIndex)
return quickSelect(nums, k, low, pivotIndex - 1);
else
return quickSelect(nums, k, pivotIndex + 1, high);
}
// 主函数测试
int findKthLargest(std::vector<int>& nums, int k) {
if (k < 1 || k > nums.size())
return -1; // 防止非法输入
return quickSelect(nums, nums.size() - k, 0, nums.size() - 1);
}
int main() {
std::vector<int> nums = {3, 2, 1, 5, 6, 4};
int k = 2;
int result = findKthLargest(nums, k);
std::cout << "The " << k << "th largest element is: " << result << std::endl;
return 0;
}
```
这个程序首先定义了`partition`函数用于将数组分为两部分,并确定基准元素的位置。然后在`quickSelect`函数中递归地处理较小或较大的部分直到找到第k大元素。最后,`findKthLargest`函数负责调用并返回结果。
阅读全文