用c语言写一个程序,从键盘输入一组数据,利用分治法求一组数据中最大的两个数和最小的两个数。
时间: 2024-11-12 08:43:08 浏览: 22
求一组数组的两个最大值和两个最小值 分治法
4星 · 用户满意度95%
在C语言中,我们可以使用分治算法来解决这个问题。这里是一个简单的示例,首先通过用户输入获取数组,然后递归地找出最小值和最大值,最后再找到次小值和次大值。以下是代码实现:
```c
#include <stdio.h>
// 辅助函数:用于查找数组中第k小/大的元素
int findKth(int arr[], int low, int high, int k) {
if (low == high) { // 只有一个元素
return arr[low];
}
int mid = (low + high) / 2;
// 如果k在左半部分,直接找左半部分的第k小/大
if (k <= arr[mid]) {
return findKth(arr, low, mid, k);
} else {
// 否则,k在右半部分,在右半部分寻找第k - arr[mid]小/大的元素
return findKth(arr, mid + 1, high, k - arr[mid]);
}
}
// 主函数,输入一组数据并打印出最大的两个数和最小的两个数
void findMinMax(int arr[], int n) {
int max1 = findKth(arr, 0, n - 1, n - 1); // 找到最大值
int min1 = findKth(arr, 0, n - 1, 0); // 找到最小值
// 现在我们知道第一个最小值和最大值了,再分别找到次小和第二大
int secondMin = findKth(arr, 0, n - 1, 1); // 第二小值
int secondMax = *max_element(arr, arr + n); // 使用库函数找到第二大值
printf("最大两个数:%d 和 %d\n", max1, secondMax);
printf("最小两个数:%d 和 %d\n", min1, secondMin);
}
int main() {
int size;
printf("请输入数组的大小:");
scanf("%d", &size);
int data[size];
printf("请输入数组元素:");
for (int i = 0; i < size; i++) {
scanf("%d", &data[i]);
}
findMinMax(data, size);
return 0;
}
```
运行这个程序时,先输入数组的长度,然后按照提示输入每个数组元素,最后会输出数组中最大的两个数和最小的两个数。
阅读全文