利用分治法求一组数据中最大的两个数和最小的两个数,c语言具体代码
时间: 2023-10-29 21:18:36 浏览: 158
以下是一个利用分治法求一组数据中最大的两个数和最小的两个数的C语言代码示例:
```c
#include <stdio.h>
/* 定义结构体用于存储最大最小值 */
struct max_min {
int max1, max2; // 最大的两个数
int min1, min2; // 最小的两个数
};
/* 定义函数进行分治计算 */
struct max_min find_max_min(int arr[], int start, int end) {
struct max_min mm, left, right;
int mid;
/* 只有一个元素时直接返回 */
if (start == end) {
mm.max1 = arr[start];
mm.max2 = arr[start];
mm.min1 = arr[start];
mm.min2 = arr[start];
return mm;
}
/* 两个元素时直接比较返回 */
if (end == start + 1) {
if (arr[start] > arr[end]) {
mm.max1 = arr[start];
mm.max2 = arr[end];
mm.min1 = arr[end];
mm.min2 = arr[start];
} else {
mm.max1 = arr[end];
mm.max2 = arr[start];
mm.min1 = arr[start];
mm.min2 = arr[end];
}
return mm;
}
/* 递归计算左右两部分的最大最小值 */
mid = (start + end) / 2;
left = find_max_min(arr, start, mid);
right = find_max_min(arr, mid + 1, end);
/* 合并左右两部分的最大最小值 */
if (left.max1 > right.max1) {
mm.max1 = left.max1;
mm.max2 = left.max2 > right.max1 ? left.max2 : right.max1;
} else {
mm.max1 = right.max1;
mm.max2 = right.max2 > left.max1 ? right.max2 : left.max1;
}
if (left.min1 < right.min1) {
mm.min1 = left.min1;
mm.min2 = left.min2 < right.min1 ? left.min2 : right.min1;
} else {
mm.min1 = right.min1;
mm.min2 = right.min2 < left.min1 ? right.min2 : left.min1;
}
return mm;
}
/* 主函数用于测试 */
int main() {
int arr[] = { 5, 2, 7, 1, 9, 3 };
int len = sizeof(arr) / sizeof(arr[0]);
struct max_min mm = find_max_min(arr, 0, len - 1);
printf("Max1: %d, Max2: %d, Min1: %d, Min2: %d\n", mm.max1, mm.max2, mm.min1, mm.min2);
return 0;
}
```
在这个程序中,我们定义了一个结构体 `max_min` 来存储最大最小值,然后定义了一个函数 `find_max_min` 来进行分治计算。在 `find_max_min` 函数中,我们首先处理了只有一个元素和两个元素的情况。然后递归计算左右两部分的最大最小值,最后合并左右两部分的最大最小值。在主函数中,我们用一个简单的示例数组来测试 `find_max_min` 函数的正确性。
阅读全文