代码改变世界

Programe_Of_Beauty:2.10 寻找数组中的最大值和最小值

2011-05-31 21:43  x_feng  阅读(225)  评论(0)    收藏  举报

1.问题定义

对于一个由N个整数组成的数组,需要比较多少次才能把最大和最小的数找出来呢?

2.编程之美解法

解法一,遍历数组一次,分别比较,最大最小值,比较次数为2*N。

解法二,遍历数组,每两个进行比较,小的放前面,大的放后面,如a[0]和a[1]比较,如果a[1]大,则交换,比较N/2次。这样,最大数在偶数位上,最小数在奇数位上,然后再各比较N/2次,共比较1.5N次。但是该方法改变了原有的数组结构,数据有变动。

解法三,设置两个变量Max,Min。遍历数组,每两个数据进行比较,大的再跟Max比较,小的跟Min比较,共1.5N次。似乎是最少的比较次数了。具体实现如下:

void FindArrayMaxMin(int* arr, int size)
{
	int max = INT_MIN;//#include <limits.h>
	int min = INT_MAX;
	for (int i = 0; i + 1 < size; i = i + 2)
	{
		if (arr[i] > arr[i + 1])
		{
			if (arr[i] > max)
			{
				max = arr[i];
			}
			if (arr[i + 1] < min)
			{
				min = arr[i + 1];
			}
		}
		else
		{
			if (arr[i + 1] > max)
			{
				max = arr[i + 1];
			}
			if (arr[i] < min)
			{
				min = arr[i];
			}
		}
	}
	if (size % 2 == 1)//数组大小为奇数,最后一位还没有比较
	{
		if (arr[i] > max)
		{
			max = arr[i];
		}
		if (arr[i] < min)
		{
			min = arr[i];
		}
	}
	cout<<"Max="<<max<<endl;
	cout<<"Min="<<min<<endl;
}

解法四,分治的思想,但是并没有减少比较次数。实现不够简洁