利用简单的c语言代码写分治法实现在n个元素的集合中选出最大值和次大值以及最小值和次小值;
时间: 2024-05-29 11:11:52 浏览: 13
#include <stdio.h>
// 求最大值和次大值
void max2(int a[], int left, int right, int *max, int *max2) {
int mid, max1, max2_1, max2_2;
if (left == right) {
*max = a[left];
*max2 = a[left];
} else if (left == right - 1) {
if (a[left] > a[right]) {
*max = a[left];
*max2 = a[right];
} else {
*max = a[right];
*max2 = a[left];
}
} else {
mid = (left + right) / 2;
max2(a, left, mid, &max1, &max2_1);
max2(a, mid + 1, right, &max2_2, max);
if (max1 > max2_2) {
*max = max1;
*max2 = (max2_1 > max2_2) ? max2_1 : max2_2;
} else {
*max = max2_2;
*max2 = (max1 > max2_1) ? max1 : max2_1;
}
}
}
// 求最小值和次小值
void min2(int a[], int left, int right, int *min, int *min2) {
int mid, min1, min2_1, min2_2;
if (left == right) {
*min = a[left];
*min2 = a[left];
} else if (left == right - 1) {
if (a[left] < a[right]) {
*min = a[left];
*min2 = a[right];
} else {
*min = a[right];
*min2 = a[left];
}
} else {
mid = (left + right) / 2;
min2(a, left, mid, &min1, &min2_1);
min2(a, mid + 1, right, &min2_2, min);
if (min1 < min2_2) {
*min = min1;
*min2 = (min2_1 < min2_2) ? min2_1 : min2_2;
} else {
*min = min2_2;
*min2 = (min1 < min2_1) ? min1 : min2_1;
}
}
}
int main() {
int a[] = {6, 8, 2, 10, 5};
int n = sizeof(a) / sizeof(a[0]);
int max, max2, min, min2;
max2(a, 0, n - 1, &max, &max2);
min2(a, 0, n - 1, &min, &min2);
printf("max: %d, max2: %d\n", max, max2);
printf("min: %d, min2: %d\n", min, min2);
return 0;
}