C++ 最大子阵和与索引分治

C++ 最大子阵和与索引分治,c++,divide-and-conquer,C++,Divide And Conquer,我上面的代码是关于查找最大子数组和以及查找该子数组的开始索引和结束索引的 int Max(int a,int b){return (a>b)?a:b;} int Max(int a,int b,int c){return Max(Max(a,b),c);} int MaxAcrossSubArray(int arr[],int l,int m,int r,int &Start,int &End) { Start=m;//initialize start index

我上面的代码是关于查找最大子数组和以及查找该子数组的开始索引和结束索引的

int Max(int a,int b){return (a>b)?a:b;}
int Max(int a,int b,int c){return Max(Max(a,b),c);}
int MaxAcrossSubArray(int arr[],int l,int m,int r,int &Start,int &End) 
{
    Start=m;//initialize start index
    int sum=arr[m];
    int sum_l=arr[m];
    for(int i=m-1;i>=l;--i)//include mid(---------|)
    {
        sum+=arr[i];
        if(sum>sum_l)
        {
            Start=i;
            sum_l=sum;
        }

    }
    End=m+1;//initialize end index
    sum=arr[m+1];
    int sum_r=arr[m+1];
    for(int i=m+2;i<=r;++i)//include mid(|-----------------)
    {
        sum+=arr[i];
        if(sum>sum_r){
            End=i;
            sum_r=sum;
        }
    }
    return sum_l+sum_r;//(-----------|---------------------)

}
int MaxSubArray(int arr[],int l,int r,int &Start,int &End)
{
    if(l==r)
    {
        Start=l;
        End=r;
        return arr[l];
    }

    else
    {
        int mid=(l+r)/2;
        int a=MaxSubArray(arr,l,mid,Start,End);
        int b=MaxSubArray(arr,mid+1,r,Start,End);
        int c=MaxAcrossSubArray(arr,l,mid,r,Start,End);
        int Maximum=Max(a,b,c);

        if(Maximum==a)
            return MaxSubArray(arr,l,mid,Start,End);
        else if(Maximum==b)
            return MaxSubArray(arr,mid+1,r,Start,End);
        else
            return MaxAcrossSubArray(arr,l,mid,r,Start,End);
    }

}
intmax(inta,intb){return(a>b)?a:b;}
intmax(inta,intb,intc){返回Max(Max(a,b,c);}
int MaxAcrossSubArray(int arr[],int l,int m,int r,int&Start,int&End)
{
Start=m;//初始化开始索引
整数和=arr[m];
int sum_l=arr[m];
对于(int i=m-1;i>=l;--i)//包括中间(-------------i)
{
总和+=arr[i];
如果(总和>总和)
{
开始=i;
sum_l=sum;
}
}
End=m+1;//初始化结束索引
总和=arr[m+1];
int sum_r=arr[m+1];
对于(整数i=m+2;整数r){
End=i;
sum_r=sum;
}
}
返回和+和//(-----------|---------------------)
}
int MAXSARRAY(int arr[],int l,int r,int&Start,int&End)
{
如果(l==r)
{
开始=l;
End=r;
返回arr[l];
}
其他的
{
int mid=(l+r)/2;
int a=最大子阵列(arr、l、mid、Start、End);
int b=最大子阵列(arr,mid+1,r,Start,End);
int c=最大交叉子阵列(arr、l、mid、r、Start、End);
int最大值=最大值(a、b、c);
如果(最大值==a)
返回最大子阵列(arr、l、mid、Start、End);
否则如果(最大==b)
返回最大子阵列(arr、mid+1、r、Start、End);
其他的
返回MaxAcrossSubArray(arr、l、mid、r、Start、End);
}
}

我的算法在任何情况下都运行良好,但我仍然需要你们帮助我改进我的算法,使之更好。有什么方法可以使它更好吗

请更好地定义。如果您的代码工作正常,并且您想知道它是否可以改进,那么它属于StackOverflow,而不是StackOverflow。至少,缓冲第一次递归调用的结果,那么您不需要做两次相同的工作(
a=maxSub(startA,endA);If(max==a){start=startA;end=endA;return a;}
另一项改进是更广泛地使用标准库。例如,您不需要定义int Max(int,int),因为标头中已经为您定义了std::max。那么,命名可能会更好。“arr”、“l”、“mid”、“r”从代码审查的角度来看听起来不太清楚。最后,@Fureeish提到,如果代码没有问题,这应该属于CodeReview,而不是StackOverflow。