要使用分治法来找到一组数据中最大的两个数和最小的两个数,你可以实现一个递归函数。以下是相应的代码示例:
#include <stdio.h>
void findMinMax(int arr[], int left, int right, int* min1, int* min2, int* max1, int* max2) {
if (left == right) { // 当只有一个元素时,即为最小和最大
*min1 = *max1 = arr[left];
*min2 = *max2 = arr[left];
return;
}
if (right - left == 1) { // 当只有两个元素时,比较大小确定最小和最大
if (arr[left] <= arr[right]) {
*min1 = arr[left];
*max1 = arr[right];
} else {
*min1 = arr[right];
*max1 = arr[left];
}
*min2 = *min1;
*max2 = *max1;
return;
}
int mid = (left + right) / 2;
// 分别在左半部分和右半部分递归查找最小和最大值
int leftMin1, leftMin2, leftMax1, leftMax2;
findMinMax(arr, left, mid, &leftMin1, &leftMin2, &leftMax1,&leftMax2);
int rightMin1, rightMin2, rightMax1, rightMax2;
findMinMax(arr,mid+ 1,right,&rightMin1,&rightMin2,&rightMax1,&rightMax2);
// 找出左半部分和右半部分的最小值
if (leftMin1 <= rightMin1) {
*min1 = leftMin1;
*min2 = (leftMin2 <= rightMin1) ? leftMin2 : rightMin1;
} else {
*min1 = rightMin1;
*min2 = (rightMin2 <= leftMin1) ? rightMin2 : leftMin1;
}
// 找出左半部分和右半部分的最大值
if (leftMax1 >= rightMax1) {
*max1 = leftMax1;
*max2 = (leftMax2 >= rightMax1) ? leftMax2 : rightMax1;
} else {
*max1 = rightMax1;
*max2 = (rightMax2 >= leftMax1) ? rightMax2 : leftMax1;
}
}
int main() {
int num, i;
scanf("%d", &num);
int arr[num];
for(i = 0; i < num; i++)
scanf("%d", &arr[i]);
int min1, min2, max1, max2;
findMinMax(arr, 0, num - 1, &min1, &min2, &max1,&max2);
printf("max1=%d max2=%d\n", max1, max2);
printf("min1=%d min2=%d\n", min1, min2);
return 0;
}
你可以将上述代码复制到给定的代码框中,然后运行测试数据进行验证。输出结果应该与预期输出一致。希望对你有所帮助!
内容由零声教学AI助手提供,问题来源于学员提问




