使用c语言编写,利用分治法求一组数据中最大的两个数和最小的两个数
时间: 2024-10-22 16:18:39 浏览: 57
在C语言中,我们可以使用分治算法(Divide and Conquer)的思想来寻找数组中的最大值、最小值以及它们的组合。这里提供一个简单的例子,我们将分别处理找到最大值和最小值,然后合并结果。
1. 找到最大值和最小值:
```c
#include <stdio.h>
// 函数声明
int findMax(int arr[], int low, int high);
int findMin(int arr[], int low, int high);
// 主函数
void minMaxPair(int arr[], int n) {
int max1 = findMax(arr, 0, n - 1); // 找到第一个最大值
int min1 = findMin(arr, 0, n - 1); // 找到第一个最小值
// 如果数组只有一个元素,直接返回
if (n == 1) {
printf("Smallest pair: %d\n", min1);
printf("Largest pair: %d\n", max1);
return;
}
int max2 = findMax(arr, 0, n - 2); // 找到第二个最大值
int min2 = findMin(arr, 1, n - 1); // 避免与第一个最小值冲突,从下一个元素开始找
printf("Smallest pair: (%d, %d)\n", min1, min2);
printf("Largest pair: (%d, %d)\n", max1, max2);
}
// 分治函数 - 找最大值
int findMax(int arr[], int low, int high) {
if (low == high)
return arr[low];
else {
int mid = (low + high) / 2;
int max1 = findMax(arr, low, mid); // 递归左半部分
int max2 = findMax(arr, mid + 1, high); // 递归右半部分
return (max1 > max2) ? max1 : max2; // 返回左右两部分的最大值
}
}
// 分治函数 - 找最小值
int findMin(int arr[], int low, int high) {
if (low == high)
return arr[low];
else {
int mid = (low + high) / 2;
int min1 = findMin(arr, low, mid); // 递归左半部分
int min2 = findMin(arr, mid + 1, high); // 递归右半部分
return (min1 < min2) ? min1 : min2; // 返回左右两部分的最小值
}
}
// 测试程序
int main() {
int arr[] = {5, 2, 9, 1, 7, 6};
int n = sizeof(arr) / sizeof(arr[0]);
minMaxPair(arr, n);
return 0;
}
```
在这个程序中,`findMax` 和 `findMin` 函数采用分治策略将数组一分为二,递归地找到每个部分的最大值和最小值。主函数则负责初始化并调用这两个函数,最后输出最小对和最大对。
阅读全文