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

设计一个算法:用不多于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.

你可能感兴趣的:(Data,Structure,Algorithm)