最大子数组问题

本文介绍了一种寻找一维数组中具有最大和的连续子数组的算法实现,并提供了详细的代码解释。该算法通过递归方式从数组中间开始,分别向两端扩展计算子数组的最大和。
#include<iostream>//使用时,请使用Maxarray函数
using namespace std;
int max(int a,int b,int c)//返回三个数中最大者。
{
    return a>b?(a>c?a:c):(b>c?b:c);
}
void f(int *low,int len,int max0)//参数分别为:数组首地址,数组长度,目前求得的最大值
{
    int i,j,x=0,y=0,t=0,sum1=0,sum2=0,max1=0,max2=0,max3=0;
    if(len%2) t=1;//如果长度为奇数,那么后半段就比前半段长1。
    for(i=len/2-1;i>=0;i--)//从中间往前求和。
    {
        sum1+=low[i];
        if(sum1>max1)
        {
            max1=sum1;
            x=i;
        }
    }
    for(j=0;j<len/2+t;j++)//从中间往后求和。
    {
        sum2+=low[j+len/2];
        if(sum2>max2)
        {
            max2=sum2;
            y=j;
        }
    }
    max3=max1+max2;//max3为跨越中点的最大和。
    if(max0>max(max1,max2,max3))//当此次寻找到的最大和比上次找到的小,就结束递归。
        return;
    cout<<"最大子数组的区间为("<<x<<","<<x+y+1<<")"<<endl;
    cout<<"最大和为"<<max(max1,max2,max3)<<endl;
    if(max(max1,max2,max3)==max1)//如果最大和产生在前半段,那么在前半段再次寻找。
        f(low+x,len/2-x,max1);
    else if(max(max1,max2,max3)==max2)//如果最大和产生在后半段,那么在后半段再次寻找。
        f(low+len/2,y,max2);
    else if(max(max1,max2,max3)==max3)//如果最大和产生在跨越中点的部分,那么就在跨越中点的部分再次寻找。
        f(low+x,len/2-x+y,max3);
}
void Maxarray(int *low,int len)//为了使用方便,把第三个参数设置在最大子数组的主要函数内,这样使用时就只需输入两个参数了
{
    f(low,len,0);
}
int main()
{
    int a[]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
    Maxarray(a,16);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值