如何使用C++的分治法和二分策略设计一个递归算法来同时找出顺序存储线性表中最大值和最小值?并请提供相应的测试用例来验证这个算法。
时间: 2024-10-23 13:05:15 浏览: 27
在C++中,我们可以利用分治法和二分策略来设计一个递归算法来寻找有序线性表的最大值和最小值。这里我们假设列表是升序排列的。首先,我们需要两个辅助函数,一个用于查找左端的最大值,另一个用于查找右端的最小值。
```cpp
// 定义一个通用的递归函数,接收区间 [start, end]
pair<int, int> findMinMax(int start, int end, vector<int>& nums) {
// 分治策略:如果只有一个元素,返回该元素作为最大和最小值
if (start == end)
return {nums[start], nums[start]};
// 二分策略:将区间的中间点作为基准,将列表分为两部分
int mid = start + (end - start) / 2;
// 计算左半部分的最大值和右半部分的最小值
pair<int, int> leftMax = findMinMax(start, mid, nums);
pair<int, int> rightMin = findMinMax(mid + 1, end, nums);
// 最大值在左右两边取较大者,最小值在两边取较小者
return {max(leftMax.first, rightMin.first), min(leftMax.second, rightMin.second)};
}
int main() {
vector<int> nums = {1, 2, 3, 4, 5};
auto result = findMinMax(0, nums.size() - 1, nums);
cout << "Max value: " << result.first << ", Min value: " << result.second << endl;
// 测试用例
vector<int> testCases = {{-10, -9, -8, ..., 0, 1, 2}, // 升序
{-10, -9, ..., 0, 1, 2, 3}, // 升序且只有一个元素
{1, 2, ..., 100}, // 非空全序数组
{}}; // 空数组
for (const auto& testCase : testCases) {
auto res = findMinMax(0, testCase.size() - 1, testCase);
cout << "For array: ";
for (int num : testCase) {
cout << num << " ";
}
cout << "\nResult: Max = " << res.first << ", Min = " << res.second << endl;
}
return 0;
}
```
在这个例子中,`findMinMax` 函数会递归地将线性表划分为更小的部分,直到每个部分只包含一个元素。然后,通过比较左右两边找到各自的最大值和最小值,并最终返回整个序列的最值。测试用例展示了各种情况下的正确结果。
阅读全文