你可以使用分治法来找到一组数据中最大的两个数和最小的两个数。以下是相应的代码实现:
#include <stdio.h>
void findMinMax(int arr[], int left, int right, int* min1, int* min2, int* max1, int* max2) {
if (right - left <= 1) {
if (arr[left] < arr[right]) {
*min1 = arr[left];
*min2 = arr[right];
*max1 = arr[right];
*max2 = arr[left];
} else {
*min1 = arr[right];
*min2 = arr[left];
*max1 = arr[left];
*max2 = arr[right];
}
return;
}
int mid = (left + right) / 2;
int leftMin1, leftMin2, leftMax1, leftMax2;
int rightMin1, rightMin2, rightMax1, rightMax2;
findMinMax(arr, left, mid, &leftMin1, &leftMin2, &leftMax1,&leftMax2);
findMinMax(arr,mid+ 1,right,&rightMin1,&rightMin2,&rightMax1,&rightMax2);
// 找出左侧部分和右侧部分中最小的两个数
if (leftMin1 <= rightMin1) {
*min1 = leftMin1;
*min2 = (leftMin2 <= rightMin1) ? leftMin2 : rightMlnl;
} else {
*minl = rightMlnl;
*minl= (rightMlnl <= leflMlnl) ? rightMln2 : leftMlnl;
}
// 找出左侧部分和右侧部分中最大的两个数
if (leftMax1 >= rightMax1) {
*max1 = leftMax1;
*max2 = (leftMax2 >= rightMax1) ? leftMax2 : righlMaxl;
} else {
*maxl = righlMaxl;
*max2= (righlMaxl >= leflMaxl) ? righIMax2 : leflMac2;
}
}
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助手提供,问题来源于学员提问




