在数组中限制次数的取最大值和最小值问题

设计一个算法:用不多于3n/2的平均比较次数,在数组A[1,…,n]中找出最大值和最小值的元素。


算法思想:如果在查找出最大值和最小值的元素时各遍历一遍所有元素,则至少要比较2n次,所以使用一遍遍历找出最大值和最小值的元素。
实现此思想的函数如下:
void maxmin(int A[],int n)
{
	int i;
	int max,min;
	max = A[1];
	min = A[1];
	for (i=2; i<=n; ++i)
	{
		if (A[i] > max)
		{
			max = A[i];
		}
		else if (A[i] < min)
		{
			min = A[i];
		}
	}
	cout << "max= " << max << ",min=" << min << endl;
}
在这个函数中,最坏的情况是A中的元素按递减次序排列,这时(A[i] > max)条件均不成立,比较的次数为n-1.另外,每次都要比较(A[i] < min),同样比较的次数为n-1。因此,总的比较次数为2(n-1)。最好的情况是A中的元素按递增次序排列,这时(A[i] > max)条件均成立,不会再执行else的比较,所以总的比较次数为n-1.
平均比较次数为[2(n-1)+n-1]/2 = 3n/2 - 3/2 <= 3n/2
由此可知,本算法的平均比较次数不多于3n/2.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值