分治法实现在n个元素的集合中选出最大值和次大值以及最小值和次小值;c/c++实现,写出代码
时间: 2024-05-08 20:15:48 浏览: 89
分治算法实验(用分治法查找数组元素的最大值和最小值).pdf
5星 · 资源好评率100%
以下是C++代码实现:
```cpp
#include <iostream>
#include <vector>
using namespace std;
void find_max_min(vector<int>& nums, int left, int right, int& max_val, int& min_val) {
// 只有一个元素的情况
if (left == right) {
max_val = nums[left];
min_val = nums[left];
return;
}
// 有两个元素的情况
if (left + 1 == right) {
if (nums[left] > nums[right]) {
max_val = nums[left];
min_val = nums[right];
} else {
max_val = nums[right];
min_val = nums[left];
}
return;
}
// 分治递归
int mid = left + (right - left) / 2;
int max_left, min_left, max_right, min_right;
find_max_min(nums, left, mid, max_left, min_left);
find_max_min(nums, mid + 1, right, max_right, min_right);
// 合并结果
max_val = max(max_left, max_right);
min_val = min(min_left, min_right);
}
int main() {
vector<int> nums = {3, 5, 1, 7, 9, 2};
int max_val, min_val;
find_max_min(nums, 0, nums.size() - 1, max_val, min_val);
cout << "Max value: " << max_val << endl;
cout << "Min value: " << min_val << endl;
return 0;
}
```
首先定义了一个函数 `find_max_min`,用来在给定的左右区间内查找最大值和最小值。如果区间只有一个元素,则最大值和最小值就是这个元素本身;如果区间有两个元素,则比较它们之间的大小关系确定最大值和最小值;如果区间有多个元素,则采用分治递归的方法,将区间一分为二,对左右两个子区间分别调用 `find_max_min` 函数,然后将左右子区间的最大值和最小值合并,得到整个区间的最大值和最小值。
最后在 `main` 函数中,定义了一个数组 `nums`,并调用 `find_max_min` 函数查找其中的最大值和最小值。
阅读全文