算法学习十五----找数组最大值和最小值

来源:互联网 发布:淘宝开个人食品店 编辑:程序博客网 时间:2024/05/20 07:32

题目:给定一个数组,找出数组中的最大值和最小值

算法思路一:使用两个“游标”,p代表最大值,q代表最小值,初始为数组的第一个和第二个,不断向后移并且做比较,每次移动时将较大值与p比较,将p赋为较大值,较小值也同理。这样就能找到最大值和最小值。此算法要注意的地方就是当数组只有一个元素以及数组的个数为奇数个时要做另外的处理

算法伪代码如下:

if array.size = 1then max = min = array[0]max = Max(arr[0], arr[1]), min = Min(arr[0], arr[1])for i <- 0 to size j <- i+1 to sizeif max < Max(arr[i], arr[j])then max = maxoneif min > Min(arr[i], arr[j])then min = minoneif size is not eventhen compare max and min with last elementgot max and min


C++实现:

//solution 1template <class T>void FindMaxMin(T *arr, int size){    T max = 0, min = 0;    //if array.size = 1    if(size == 1)    {        //max = min = array[0]        cout << "max : " << arr[0] << " min : " << arr[0] << endl;        return;    }    //max = Max(arr[0], arr[1]), min = Min(arr[0], arr[1])    max = Max(arr[0], arr[1]);    min = Min(arr[0], arr[1]);    //for i <- 0 to size j <- i+1 to size    for(int i = 0, j = i+1; i != size && j != size; ++i, ++j)    {        //if max < Max(arr[i], arr[j])        if(max < Max(arr[i], arr[j]))        {            //then max = maxone            max = Max(arr[i], arr[j]);        }        //if min > Min(arr[i], arr[j])        if(min > Min(arr[i], arr[j]))        {            //then min = minone            min = Min(arr[i], arr[j]);        }    }    //if size is not even    if(size%2 != 0)    {        //then compare max and min with last element        if(max < arr[size-1])        {            max = arr[size-1];        }        if(min > arr[size-1])        {            min = arr[size-1];        }    }        //got max and min    cout << "max : " << max << " min : " << min << endl;}



算法思路二:
采用分治的方法,先计算得到前后N/2个数的最大和最小值,再将N/2个数划分为两个数组分别求两个数组的最大值和最小值,以此类推,最后可以得到整个数组的最大值和最小值。

算法伪代码如下:

if remain 2 element or one elementthen max = maxone, min = minoneFindMaxMin in 2 size/2 counts'array recursionlymax = maxone, min = minone

C++实现:

template <class T>NumberPair<T> FindMaxMin(T * arr, int begin, int end){    //if remain 2 element or one element    if(end - begin <= 1)    {        //then max = maxone, min = minone        NumberPair<T> n;        if(arr[begin] < arr[end])        {            n.max = arr[end];            n.min = arr[begin];            return n;        }        else        {           n.max = arr[begin];           n.min = arr[end];           return n;        }    }    //FindMaxMin in 2 size/2 counts'array recursionly    NumberPair<T> L = FindMaxMin(arr, begin, begin + (end-begin) / 2);    NumberPair<T> R = FindMaxMin(arr, begin + (end-begin) / 2 + 1, end);    //max = maxone, min = minone    NumberPair<T> result;    result.max = Max(L.max, R.max);    result.min = Min(L.min, R.min);    return result;}


0 0
原创粉丝点击