用c语言写一个程序,从键盘输入一组数据,利用分治递归法求一组数据中最大的两个数和最小的两个数。给出正确可运行的代码和中文注释
时间: 2024-11-12 18:43:37 浏览: 23
在C语言中,我们可以编写一个简单的程序来利用分治递归法寻找一组数据中的最大值、次大值、最小值和次小值。以下是一个示例程序,包括主函数和辅助函数:
```c
#include <stdio.h> // 包含输入输出头文件
// 辅助函数:找出数组中的最大值和次大值
void findMaxAndSecondMax(int arr[], int low, int high, int* max, int* secondMax) {
if (low == high) { // 如果只有一个元素,直接返回
*max = arr[low];
*secondMax = arr[low]; // 对于单元素数组,最大值等于次大值
return;
}
int mid = (low + high) / 2; // 找到中间索引
int firstMax = arr[mid], secondMaxInLeft = firstMax;
// 分别在左半部分和右半部分寻找最大值和次大值
findMaxAndSecondMax(arr, low, mid, &firstMax, &secondMaxInLeft);
findMaxAndSecondMax(arr + mid + 1, mid + 1, high, &secondMax, &firstMax);
// 更新结果
if (*secondMax < secondMaxInLeft) { // 如果当前找到的次大值小于左半部分的次大值
*secondMax = secondMaxInLeft;
}
if (*max < firstMax) { // 如果当前最大值小于左右两部分的最大值
*max = firstMax;
}
}
// 主函数:接收用户输入并调用辅助函数
int main() {
int n, i;
printf("请输入数组的长度:");
scanf("%d", &n);
int arr[n];
printf("请输入%d个整数:\n", n);
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int max1, max2, min1, min2;
findMaxAndSecondMax(arr, 0, n - 1, &max1, &max2); // 寻找最大值和次大值
findMaxAndSecondMax(arr, 0, n - 1, &min1, &min2); // 寻找最小值和次小值
printf("最大值: %d, 次大值: %d\n", max1, max2);
printf("最小值: %d, 次小值: %d\n", min1, min2);
return 0;
}
```
阅读全文