用c++写一个程序,使其利用分治法求一组数据中最大的两个数和最小的两个数。不使用向量
时间: 2024-11-12 10:39:52 浏览: 30
分治法求两个大整数相乘
```cpp
#include <iostream>
// 分治法辅助函数,用于找到数组中的前两个最小值
void findTwoMin(int arr[], int left, int right, int& min1, int& min2) {
if (left == right) {
min1 = arr[left];
min2 = *std::next(arr.begin(), left); // 使用迭代器获取下一个元素
return;
}
int mid = (left + right) / 2;
int temp1, temp2;
// 分治过程,分别找出左半部分和右半部分的最小值
findTwoMin(arr, left, mid, temp1, temp2);
findTwoMin(arr, mid + 1, right, min1, min2);
// 更新全局最小值
if (min1 > temp1) {
min2 = min1;
min1 = temp1;
} else if (min2 > temp1 && min1 != temp2) {
min2 = temp1;
}
// 如果中间元素比min2还小,更新min2
if (temp2 < min2 && temp2 != min1) {
min2 = temp2;
}
}
// 分治法辅助函数,用于找到数组中的前两个最大值
void findTwoMax(int arr[], int left, int right, int& max1, int& max2) {
if (left == right) {
max1 = arr[left];
max2 = *std::prev(arr.end()); // 使用迭代器获取前一个元素
return;
}
int mid = (left + right) / 2;
int temp1, temp2;
findTwoMax(arr, left, mid, temp1, temp2);
findTwoMax(arr, mid + 1, right, max1, max2);
// 更新全局最大值
if (max1 < temp1) {
temp2 = max1;
max1 = temp1;
} else if (max2 < temp1 && max1 != temp2) {
max2 = temp1;
}
// 如果中间元素比max2还大,更新max2
if (temp2 > max2 && temp2 != max1) {
max2 = temp2;
}
}
int main() {
int n;
std::cout << "请输入数组长度:";
std::cin >> n;
int arr[n];
std::cout << "请输入" << n << "个整数:";
for (int i = 0; i < n; ++i)
std::cin >> arr[i];
int min1, min2;
findTwoMin(arr, 0, n - 1, min1, min2);
int max1, max2;
findTwoMax(arr, 0, n - 1, max1, max2);
std::cout << "最小的两个数是:" << min1 << " 和 " << min2 << std::endl;
std::cout << "最大的两个数是:" << max1 << " 和 " << max2 << std::endl;
return 0;
}
```
阅读全文