思路:分别找出左右两个区间的最大值和次大值,然后从这四个数里找出最大值和次大值
代码:
#include <stdio.h>
void swap(int *a,int *b)
{
int t=*a;
*a=*b;
*b=t;
}
void max(int str[],int lo,int hi,int & x1,int & x2)//包括lo,不包括hi
{
if(lo+2==hi)//两个元素 lo,lo+1 ,不包括hi
{
x1=str[lo];
x2=str[lo+1];
if(x1<x2) swap(&x1,&x2);
printf("2:%d %d\n",x1,x2);
return;
}
if(lo+3==hi)//三个元素 lo,lo+1,lo+2 ,不包括hi
{
x1=str[lo];
x2=str[lo+1];
if(x1<x2) swap(&x1,&x2);
if(str[lo+2]>x2)
{
x2=str[lo+2];
if(x1<x2) swap(&x1,&x2);
}
printf("3:%d %d\n",x1,x2);
return;
}
int mi=(lo+hi)/2;
int xl1,xl2;max(str,lo,mi,xl1,xl2);
int xr1,xr2;max(str,mi,hi,xr1,xr2);
if(xl1>xr1)
{
x1=xl1;
x2=(xl2>xr1) ? xl2 : xr1;
}
else{
x1=xr1;
x2=(xr2>xl1) ? xr2 : xl1;
}
printf("合并:%d %d\n",x1,x2);
}
int main(int argc, char** argv) {
int str[13]={1,28,2,5,4,6,9,8,19,17,10,29,20};
int x1=0;
int x2=0;
max(str,0,13,x1,x2);
printf("%d %d",x1,x2);
return 0;
}
运行结果:
图中带3的表示:3个元素中找出的最大数和次大数
图中带2的表示:2个元素中找出的最大数和次大数