C语言【问题描述】利用分治算法求一个n运算数组的最大元素和最小元素 【输入形式】输入两行,第一行为一个整数n(n<100).第二行为数组的n个元素; 【输出形式】输出两个数,一个是数组最大元素的值,一个是数组最小元素的值,中间用空格隔开 【样例输入】 8 8 3 2 9 7 1 5 4 【样例输出】 9 1 【样例说明】 数组中有8个元素,最大值为9,最小值为1 ;
时间: 2023-11-29 15:04:53 浏览: 100
以下是C语言的代码实现:
```c
#include <stdio.h>
int max(int a, int b) {
return a > b ? a : b;
}
int min(int a, int b) {
return a < b ? a : b;
}
void max_min(int a[], int left, int right, int *max_val, int *min_val) {
if (left == right) { // 数组只有一个元素
*max_val = a[left];
*min_val = a[left];
} else if (left + 1 == right) { // 数组有两个元素
*max_val = max(a[left], a[right]);
*min_val = min(a[left], a[right]);
} else { // 数组有多个元素
int mid = (left + right) / 2;
int left_max, left_min, right_max, right_min;
max_min(a, left, mid, &left_max, &left_min);
max_min(a, mid + 1, right, &right_max, &right_min);
*max_val = max(left_max, right_max);
*min_val = min(left_min, right_min);
}
}
int main() {
int n, a[100], max_val, min_val;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
max_min(a, 0, n - 1, &max_val, &min_val);
printf("%d %d\n", max_val, min_val);
return 0;
}
```
基本思路是,通过递归将数组分成两半,然后分别求左半边和右半边的最大值和最小值,最后将左半边的最大值和右半边的最大值取最大值,左半边的最小值和右半边的最小值取最小值即可。时间复杂度为 O(nlogn)。
阅读全文