最大最小值:给n个实数,求它们之中的最大值和最小值,要求比较次数尽量小。

最大最小值给n个实数,求它们之中的最大值和最小值,要求比较次数尽量小。

用递归的方法可以做。假设需要T(n)的时间求n个数的最大值和最小值,显然T(2) = 1。我们按照分治三步法进行算法设计。

  1. 划分把n个数均分为两半。
  2. 递归求解求左半的最小值minL 和最大值maxL以及右半最小值minR和最大值maxR。
  3. 合并所有数的最大值为maxfmaxL; maxRg,最小值为minfminL; minRg。

程序如下。划分点为m = (l+r)/2,两个区间为[l,m]和[m+1,r](注意不是[l,m-1]和[m,r])

void minmax (int l , int r , int & min , int & max)
{
	int minl , minr , maxl , maxr ;
	if(r == l){ max = min = a[l ]; }
	else if(r == l+1)
	{
		if(a[l] > a[r])
			{ max = a[l]; min = a[r]; }
		else
			{ max = a[r]; min = a[l]; }
	}
	else
	{
		int m = (l+r) >> 1;
		minmax (l, m, minl, maxl );
		minmax (m+1, r, minr, maxr);
		max = maxl > maxr ? maxl : maxr ;
		min = minl < minr ? minl : minr ;
	}
}


最简单的算法就是,线性扫描挨个比较。

如果只求一列数的最大值,那么分治法并不好。假如有8个元素,挨个比较的方法找出最大值,需要比较7次;用分治法,比较的次数仍然是7次。假如有16个元素,挨个比较的方法找出最大值,需要比较15次;用分治法,比较的次数仍然是15次。

如果同时求最大值和最小值,那么分治法和线性扫描都是O(n)的复杂度,但是分治法的比较次数比线性扫描要少。

具体分析见:http://www.geeksforgeeks.org/maximum-and-minimum-in-an-array/

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值