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

这篇博客探讨了两种不同的算法来寻找数组中的最大值和最小值。第一种算法利用两个游标p和q,初始化为数组的首两个元素,通过比较更新最大值和最小值。第二种算法采用了分治策略,不断将数组分为两半,递归地找出最大值和最小值。在处理奇数长度数组和单元素数组时需特别注意。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

算法伪代码如下:

if array.size = 1
then 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 size
if max < Max(arr[i], arr[j])
then max = maxone

if min > Min(arr[i], arr[j])
then min = minone

if size is not even
then compare max and min with last element
got max and min


C++实现:

//solution 1
template <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 element
then max = maxone, min = minone
FindMaxMin in 2 size/2 counts'array recursionly
max = 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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值