题目描述
对于给定的含有n个不同元素的无序序列。请用分治法求这个序列中的最大和次大的两个元素。 (要求不能用排序)
输入
第一行,一个整数,表示元素的个数n;第二行,n个整数,表示n个元素的值。
输出
最大元素和次大元素
样例输入 Copy
7 2 4 1 5 8 3 7
样例输出 Copy
8 7
代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void getData(int [], int);
void outputData(int [], int);
void maxmin(int [], int, int, int *, int *);
int max, min;
int main(void)
{ int N;
scanf("%d",&N);
int a[N];
for(int i=0;i<N;i++){
scanf("%d",&a[i]);
}
maxmin(a, 0, N-1, &max, &min);
printf("%d %d\n", max, min);
return 0;
}
/* 分治法计算最大值和次大值的算法程序,递归实现 */
void maxmin(int d[], int left, int right, int *max, int *min)
{
int max1, min1;
if(left==right) {
*max = d[left];
*min = d[left];
} else if(left == right-1) {
if(d[left] > d[right]){
*max = d[left];
*min = d[right];
} else {
*max = d[right];
*min = d[left];
}
} else {
int mid = (left + right) / 2;
maxmin(d, left, mid, max, min);
maxmin(d, mid+1, right, &max1, &min1);
if(*max < max1){
if(min1<*max)
*min=*max;
else
*min=min1;
*max = max1;
}
else if(*max > max1){
if(*min<max1)
*min=max1;
}
}
}