用c语言写一个程序,从键盘输入一组数据,利用分治法求一组数据中最大的两个数和最小的两个数。给出正确可运行的代码
时间: 2024-11-12 22:43:07 浏览: 14
求一组数组的两个最大值和两个最小值 分治法
4星 · 用户满意度95%
在 C 语言中,我们可以编写一个使用分治法求解最大值、最小值的函数。这里我们采用分而治之的思想,先找出数组的一半的最大值和最小值,然后分别找到另一半的最大值和最小值,最后合并结果得到全局的最大值和最小值。
下面是一个简单的示例程序:
```c
#include <stdio.h>
// 辅助函数,用于找出数组的第k小(大)值
void findKth(int arr[], int low, int high, int k, int *max1, int *min1, int *max2, int *min2) {
if (high <= low)
return;
// 找到中间元素
int mid = low + (high - low) / 2;
// 分治查找左半部分的最大值和最小值
findKth(arr, low, mid, k, max1, min1, max2, min2);
// 如果是最小值(k=1),直接更新结果
if (k == 1 && arr[mid] < *min1) {
*min2 = *min1;
*min1 = arr[mid];
} else if (k > 1 && arr[mid] < *min2) {
*min2 = arr[mid];
}
// 如果是最大大值(k=2),直接更新结果
if (k == 2 && arr[mid] > *max1) {
*max2 = *max1;
*max1 = arr[mid];
} else if (k > 2 && arr[mid] > *max2) {
*max2 = arr[mid];
}
// 递归查找右半部分
findKth(arr, mid + 1, high, k - (arr[mid] < *min1), max1, min1, max2, min2);
}
int main() {
int n, i;
printf("Enter the number of elements: ");
scanf("%d", &n);
int arr[n], max1, max2, min1, min2;
for (i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
// 初始化结果
*max1 = arr[0];
*min1 = arr[0];
*max2 = arr[0];
*min2 = arr[0];
// 求解最大值和最小值
findKth(arr, 0, n - 1, 2, &max1, &min1, &max2, &min2);
printf("The two largest numbers are %d and %d\n", max1, max2);
printf("The two smallest numbers are %d and %d\n", min1, min2);
return 0;
}
```
当你运行这个程序并输入一组数字后,它会返回数组中最大的两个数以及最小的两个数。
阅读全文