分治法求n个数中第二个最大元素C语言
时间: 2023-06-20 14:05:34 浏览: 158
找到数组中第二大的元素 C语言实现
可以使用分治法来解决这个问题,具体步骤如下:
1.将n个数分成两组,分别求出每组中的最大值和次大值;
2.比较两组中的次大值,取其中较大的一个;
3.将较大的次大值所在的组继续使用步骤1和步骤2,直到只有一个数为止,这个数就是第二个最大元素。
下面是用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;
}
// 求出数组arr中的最大值和次大值
void maxAndSecondMax(int arr[], int left, int right, int *maxValue, int *secondMaxValue) {
if (left == right) {
*maxValue = arr[left];
*secondMaxValue = arr[left];
} else if (left + 1 == right) {
*maxValue = max(arr[left], arr[right]);
*secondMaxValue = min(arr[left], arr[right]);
} else {
int mid = (left + right) / 2;
int leftMax, leftSecondMax, rightMax, rightSecondMax;
maxAndSecondMax(arr, left, mid, &leftMax, &leftSecondMax);
maxAndSecondMax(arr, mid + 1, right, &rightMax, &rightSecondMax);
if (leftMax > rightMax) {
*maxValue = leftMax;
*secondMaxValue = max(rightMax, leftSecondMax);
} else {
*maxValue = rightMax;
*secondMaxValue = max(leftMax, rightSecondMax);
}
}
}
// 求出数组中的第二个最大元素
int secondMax(int arr[], int n) {
int maxValue, secondMaxValue;
maxAndSecondMax(arr, 0, n - 1, &maxValue, &secondMaxValue);
return secondMaxValue;
}
int main() {
int arr[] = {4, 6, 8, 3, 9, 1, 5, 2, 7};
int n = sizeof(arr) / sizeof(int);
int result = secondMax(arr, n);
printf("第二个最大元素为:%d\n", result);
return 0;
}
```
以上代码中,`maxAndSecondMax`函数用来求出数组中的最大值和次大值,`secondMax`函数用来求出第二个最大元素。主函数中,我们定义了一个数组用来测试函数的正确性。
阅读全文