设计一个算法,采用分治法求一个整数序列中的最大和最小元素。并写出完整的代码
时间: 2023-06-03 15:02:55 浏览: 102
分治法求解序列最大最小元素【算法设计与分析】
好的,以下是给出的代码,可以采用分治法求一个整数序列中的最大值和最小值:
```
#include<iostream>
#include<algorithm>
using namespace std;
// 分治法求最大值
int findMax(int arr[], int left, int right) {
if (left == right) { // 长度为1时直接返回
return arr[left];
} else if (left + 1 == right) { // 长度为2时比较
return max(arr[left], arr[right]);
} else { // 长度大于2时继续递归
int mid = (left + right) / 2; // 求中间位置
int leftMax = findMax(arr, left, mid); // 递归求左边的最大值
int rightMax = findMax(arr, mid + 1, right); // 递归求右边的最大值
return max(leftMax, rightMax); // 取两者最大值
}
}
// 分治法求最小值
int findMin(int arr[], int left, int right) {
if (left == right) { // 长度为1时直接返回
return arr[left];
} else if (left + 1 == right) { // 长度为2时比较
return min(arr[left], arr[right]);
} else { // 长度大于2时继续递归
int mid = (left + right) / 2; // 求中间位置
int leftMin = findMin(arr, left, mid); // 递归求左边的最小值
int rightMin = findMin(arr, mid + 1, right); // 递归求右边的最小值
return min(leftMin, rightMin); // 取两者最小值
}
}
int main() {
int arr[] = {3, 1, 4, 2, 5}; // 测试用例
int n = sizeof(arr) / sizeof(arr[0]); // 数组长度
cout << "最大值为:" << findMax(arr, 0, n - 1) << endl;
cout << "最小值为:" << findMin(arr, 0, n - 1) << endl;
return 0;
}
```
以上代码中,采用了递归的方法,将序列不断拆分为左右两个子序列,直到序列的长度为1或2,然后分别求出左右子序列的最大(小)值,最后比较两者,得到序列的最大(小)值。
阅读全文