编程之美2.10 寻找数组中的最大值和最小值

对于一个由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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值