对于一个由N个整数组成的数组,同时找到最大值和最小值,且需要多少次比较才能着出来?
看起来好像很简单,简单一遍循环可以搞掂,但是效率呢?
下面是书上给出的三种方法,我用C++实现了下。。。
参数:数组,数组起始下标,数组末尾元素下标
返回:一个结构,包括最大值,最小值,比较的次数
#include <iostream>
using namespace std;
static int times = 0;
typedef struct MM {
int max;
int min;
int times;
} MM;
//一个由N个整数组成的数组,同时找出最大和最小的值
//方法1:直接扫描一遍数组, 需要比较2*N次
MM findMaxAndMin_one(int *a, int begin, int end)
{
MM mm;
mm.max = a[begin];
mm.min = a[begin];
mm.times = 0;
while(++begin <= end)
{
mm.times++;
if(a[begin] > mm.max)
{
mm.max = a[begin];
}
mm.times++;
if(a[begin] < mm.min)
{
mm.min = a[begin];
}
}
return mm;
}
//方法2:每两两先比较,较大的再与当前max比较,较小的与当前min比较,比较次数:1.5*N
MM findMaxAndMin_two(int *a, int begin, int end)
{
MM mm;
mm.times = 0;
int step = begin;
mm.times++;
if(a[step] > a[step+1])
{
mm.max = a[step];
mm.min = a[step+1];
} else
{
mm.max = a[step+1];
mm.min = a[step];
}
step += 2;
while(step+1 <= end)
{
mm.times++;
if(a[step] > a[step+1])
{
mm.times++;
if(a[step] > mm.max)
mm.max = a[step];
mm.times++;
if(a[step+1] < mm.min)
mm.min = a[step+1];
} else
{
mm.times++;
if(a[step+1] > mm.max)
mm.max = a[step+1];
mm.times++;
if(a[step] < mm.min)
mm.min = a[step];
}
step += 2;
}
//如果数组个数是奇数,则要处理最后一个值
if(step <= end)
{
mm.times++;
if(a[step] > mm.max)
mm.max = a[step];
mm.times++;
if(a[step] < mm.min)
mm.min = a[step];
}
return mm;
}
//方法三:分治法,只需要分别求出前后N/2个数的min和max,然后取较小的min和较大的max,递归下去
MM findMaxAndMin_three(int *a, int begin, int end)
{
MM mm;
if(end - begin <= 1)
{
times++;
if(a[begin] > a[end])
{
mm.max = a[begin];
mm.min = a[end];
} else
{
mm.max = a[end];
mm.min = a[begin];
}
return mm;
}
MM left_mm = findMaxAndMin_three(a, begin, begin+(end-begin)/2);
MM right_mm = findMaxAndMin_three(a, begin+(end-begin)/2+1, end);
times++;
if(left_mm.max > right_mm.max)
mm.max = left_mm.max;
else
mm.max = right_mm.max;
times++;
if(left_mm.min < right_mm.min)
mm.min = left_mm.min;
else
mm.min = right_mm.min;
return mm;
}
int main()
{
const int LEN = 11;
int a[LEN] = { 100, 7, 3, 5, 2, 8, 1, 4, 6, 900, 1000 };
MM mm_one = findMaxAndMin_one(a, 0, LEN-1);
cout << "max : " << mm_one.max << " min : " <<
mm_one.min << " times : " << mm_one.times << endl;
MM mm_two = findMaxAndMin_two(a, 0, LEN-1);
cout << "max : " << mm_two.max << " min : " <<
mm_two.min << " times : " << mm_two.times << endl;
MM mm_three = findMaxAndMin_three(a, 0, LEN-1);
mm_three.times = times;
cout << "max : " << mm_three.max << " min : " <<
mm_three.min << " times : " << mm_three.times << endl;
return 0;
}
/*
max : 1000 min : 1 times : 20
max : 1000 min : 1 times : 15
max : 1000 min : 1 times : 19
*/