对于一个由N个整数组成的数组,需要比较多少次才能把最大和最小的数找出来呢
例如给出如下数组:5 ,6,8,3,7,9 max=9 min=3
解法一:扫描一遍数组,比较2*N次求解。
解法二:分治法,分别在前后N/2个数中求Min、Max,然后将前后的Max 、Min比较即可。
f(2)=1
f(N)
=2*f(N/2)+2
=2^2*f(N/(2^2))+4+2
=.......
=2^(logN-1)*f(N/(2^(logN-1)))+2^(logN-1)*+.....+2^2+2
=N/2*f(2) + 2*(1-2^(logN-1)/(1-2)
=1.5*N-2
比较次数1.5N
#include<iostream>
using namespace std;
struct rem
{
int max;
int min;
}L,R,M;
int flag=0;
rem Find(int num[],int start,int end)
{
if ((end-start)<=1)
{
if (num[start]<num[end])
{
M.max=num[end];
M.min=num[start];
}
else
{
M.max=num[start];
M.min=num[end];
}
}
else
{
L=Find(num,start,(start+end)/2);
flag=1;
R=Find(num,(start+end)/2+1,end);
if (R.max>L.max)
{
M.max=R.max;
}
else
{
M.max=L.max;
}
if (R.min<L.min)
{
M.min=R.min;
}
else
{
M.min=L.min;
}
return M;
}
if (flag==0)
{
if (M.max<L.max)
{
M.max=L.max;
}
if (M.min>L.min)
{
M.min=L.min;
}
}
else
{
if (M.max<R.max)
{
M.max=R.max;
}
if (M.min>R.min)
{
M.min=R.min;
}
}
return M;
}
int main()
{
int *num;
int i=0;
int x;
char ch;
L.max=INT_MIN;
L.min=INT_MAX;
R.max=INT_MIN;
R.min=INT_MAX;
cout<<"请输入一串数字,以#结束:"<<endl;
cin>>x;
num=(int *)malloc(sizeof(int));
num[0]=x;
while ((ch=getchar())!='#')
{
i++;
cin>>x;
num=(int *)realloc(num,sizeof(int)*(i+2));
num[i]=x;
}
Find(num,0,i);
cout<<"max="<<M.max<<endl;
cout<<"min="<<M.min<<endl;
return 0;
}
程序二:
#include<iostream> using namespace std; void search(int *num ,int b,int e,int &max,int &min) { if (e-b<=1) { if (num[b]<num[e]) { max=num[e]; min=num[b]; return; } else { max=num[b]; min=num[e]; return; } } search(num,b,b+(e-b)/2,max,min); int min1=min,max1=max; search(num,b+(e-b)/2+1,e,max,min); int max2=max,min2=min; if (max2>max1) { max=max2; } else { max=max1; } if (min1<min2) { min=min1; } else { min=min2; } return ; } int main(int argc,char *argv[]) { int num[]={5,6,8,3,7,9,32,4,0,45,-1,-4324,234,12 ,7}; int min,max; search(num,0,sizeof(num)/sizeof(*num)-1,max,min); cout<<"max= "<<max<<" min: "<<min; cout<<endl; return 0; }