#include<stdio.h>
int count1=0;
int count2=0;
void find_max_min(int* a,int n,int* max,int* min);//1.5n-2 compare
void find_max1_max2(int* a,int n,int* max1,int* max2);//n+logn+1 compare
int main()
{
int a[8]={4,2,3,1,5,4,6,8};
int max1,max2,min;
find_max_min(a,8,&max1,&min);
printf("max=%4d,min=%4d\n",max1,min);
printf("%2d\n",count1);
find_max1_max2(a,8,&max1,&max2);
printf("max1=%4d,max2=%4d\n",max1,max2);
printf("%2d\n",count2);
return 0;
}
void find_max_min(int* a,int n,int* max,int* min)//1.5n-2 compare
{
if(n<=0 || a==NULL)
return;
if(n==1)
{
*max=*min=a[0];
return;
}
if(n==2)
{
if(a[0]<a[1])
{
*max=a[1];
*min=a[0];
count1++;
}
else
{
*max=a[0];
*min=a[1];
count1++;
}
return;
}
else
{
int max1,max2,min1,min2;
find_max_min(a,n/2,&max1,&min1);
find_max_min(a+n/2,n-n/2,&max2,&min2);
if(max1<=max2)
{
count1++;
*max=max2;
}
else
{
*max=max1;
count1++;
}
if(min1<=min2)
{
*min=min1;
count1++;
}
else
{
*min=min2;
count1++;
}
return;
}
}
void find_max1_max2(int* a,int n,int* max1,int* max2)//n+logn compare
{
if(n<=0 || a==NULL)
return;
if(n==1)
{
*max1=*max2=a[0];
return;
}
if(n==2)
{
if(a[0]<a[1])
{
*max1=a[1];
*max2=a[0];
count2++;
}
else
{
*max1=a[0];
*max2=a[1];
count2++;
}
return;
}
else
{
int max1_temp1,max2_temp1;
int max1_temp2,max2_temp2;
find_max1_max2(a,n/2,&max1_temp1,&max2_temp1);
find_max1_max2(a+n/2,n-n/2,&max1_temp2,&max2_temp2);
if(max1_temp1<=max1_temp2)
{
*max1=max1_temp2;
count2++;
if(max1_temp1<=max2_temp1)
{
*max2=max2_temp1;
count2++;
}
else
{
*max2=max1_temp1;
count2++;
}
if(*max2<max2_temp2)
{
*max2=max2_temp2;
count2++;
}
}
else
{
*max1=max1_temp1;
count2++;
if(max1_temp2<=max2_temp1)
{
*max2=max2_temp1;
count2++;
}
else
{
*max2=max1_temp2;
count2++;
}
if(*max2<max2_temp2)
{
*max2=max2_temp2;
count2++;
}
}
return;
}
}