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;
}
解法四,分治的思想,但是并没有减少比较次数。实现不够简洁
浙公网安备 33010602011771号