用递归+分治法从数组中找出最大的两个数C语言完整代码

思路:分别找出左右两个区间的最大值和次大值,然后从这四个数里找出最大值和次大值
代码:

#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个元素中找出的最大数和次大数

猜你喜欢

转载自blog.csdn.net/qq_41386300/article/details/82945934