同时找最大最小值

题目定义:

    给定一个大小为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];
        }
    }
}

 

posted @ 2015-09-16 20:12  Sawyer Ford  阅读(866)  评论(0编辑  收藏  举报