给定数组A[n],存储n个实数,试设计一个算法,在最坏情况下用最少比较次数找出该数组中元素的最大值和最小值。 c语言代码生成
时间: 2024-03-14 12:45:54 浏览: 98
下面是使用分治思想设计的算法,时间复杂度为O(3n/2-2)。
```c
#include <stdio.h>
typedef struct {
int max;
int min;
} MaxMin;
MaxMin getMaxMin(int A[], int left, int right) {
MaxMin maxmin;
if (left == right) {
maxmin.max = A[left];
maxmin.min = A[left];
return maxmin;
} else if (left + 1 == right) {
if (A[left] > A[right]) {
maxmin.max = A[left];
maxmin.min = A[right];
} else {
maxmin.max = A[right];
maxmin.min = A[left];
}
return maxmin;
} else {
int mid = (left + right) / 2;
MaxMin leftMaxMin = getMaxMin(A, left, mid);
MaxMin rightMaxMin = getMaxMin(A, mid + 1, right);
if (leftMaxMin.max > rightMaxMin.max) {
maxmin.max = leftMaxMin.max;
} else {
maxmin.max = rightMaxMin.max;
}
if (leftMaxMin.min < rightMaxMin.min) {
maxmin.min = leftMaxMin.min;
} else {
maxmin.min = rightMaxMin.min;
}
return maxmin;
}
}
int main() {
int A[] = {1, 3, 5, 2, 4, 6};
int n = sizeof(A) / sizeof(int);
MaxMin maxmin = getMaxMin(A, 0, n - 1);
printf("max=%d, min=%d\n", maxmin.max, maxmin.min);
return 0;
}
```
在上面的代码中,`getMaxMin()`是递归函数,它实现了分治思想。当数组的长度为1时,最大值和最小值都是该元素本身;当数组的长度为2时,需要进行一次比较即可求出最大值和最小值;当数组的长度大于2时,将数组分成两个部分,分别求出左半部分和右半部分的最大值和最小值,然后将左半部分的最大值和右半部分的最大值进行比较,将左半部分的最小值和右半部分的最小值进行比较,即可得到整个数组的最大值和最小值。
阅读全文