您的位置:首页 > 其它

同时找最大最小值

2015-09-16 20:12 190 查看
题目定义:

给定一个大小为n的数组,无序,找到其中的最大值和最小值,要求元素间的比较次数尽可能少。

这道题出自《算法导论》。创新工场2016校招笔试也考了这道题。

以下摘自《算法导论》:

事实上,我们只需要最多3⌊n/2⌋次比较就可以同时找到最小值和最大值。具体的方法是记录已知的最大值和最小值,然后对输入元素成对地进行处理。首先,我们将一对输入元素相互进行比较,然后把较小的与当前最小值进行比较,把较大的与当前最大值进行比较。这样,对每两个元素共需3次比较。

如何设定已知的最小值和最大值的初始值依赖于n是奇数还是偶数。如果n是奇数,我们就将最小值和最大值的初值都设为第一个元素的值,然后成对地处理余下的元素。如果n是偶数,就对前两个元素做一次比较,以决定最小值和最大值的初值,然后与n是奇数的情形一样,成对地处理余下的元素。

贴一下我的代码:

int min;
int max;
void findMinMax(int arr[], int n, int &min, int &max)
{
int begin = 0;
if (n % 2 == 1)
{
min = max = arr[0];
begin = 1;
}
else
{
if (arr[0] < arr[1])
{
min = arr[0];
max = arr[1];
}
else
{
min = arr[1];
max = arr[0];
}
begin = 2;
}

for (int i = begin; i < n-1; i = i+2)
{
if (arr[i] < arr[i+1])
{
if (arr[i] < min)
min = arr[i];
if (arr[i+1] > max)
max = arr[i+1];
}
else
{
if (arr[i+1] < min)
min = arr[i+1];
if (arr[i] > max)
max = arr[i];
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: