【算法导论C++代码】最大子数组

#define Inf 65535
#include <iostream>
using namespace std;
void FindMaxCrossingSubarray(int *Array, int low, int mid, int high,
                             int &maxLeft,int &maxRight, int &sum);

void FindMaxmumSubarry(int *Array,int low,int high,
                       int &relow,int &rehigh,int &resum);

void main()
{
    int Array[]={13,-3,-25,20,-3,-16,
    -23,18,20,-7,12,-5,-22,15,-4,7};
    cout<<"分治策略,求最大子数组"<<endl;
    int low,high,sum;
    FindMaxmumSubarry(Array,0,15,low,high,sum);
    cout<<"买入天数"<<low<<"卖出天数"<<high<<"总盈利"<<sum<<endl;
    system("pause");

}

void FindMaxCrossingSubarray(int *Array, int low, int mid, int high,
                             int &maxLeft,int &maxRight, int &sum)
{
    int leftSum = -Inf;
    sum=0;
    for(int i=mid;i>low;i--)
    {
        sum=sum+Array[i];
        if(sum>leftSum)
        {
            leftSum=sum;
            maxLeft=i;
        }
    }

    int rightSum = -Inf;
    sum=0;
    for(int j=mid+1;j<high;j++)
    {
        sum=sum+Array[j];
        if(sum>rightSum)
        {
            rightSum=sum;
            maxRight=j;
        }
    }

    sum=leftSum+rightSum;
}
void FindMaxmumSubarry(int *Array,int low,int high,
                       int &relow,int &rehigh,int &resum)
{
    if (high==low)
    {
        relow=low;
        high=rehigh;
        resum=Array[low];
    }
    else
    {
        int mid=(low+high)/2;
        int leftLow,leftHigh,leftSum,
            rightLow,rightHigh,rightSum,
            crossLow,crossHigh,crossSum;
        FindMaxmumSubarry(Array,low,mid,leftLow,leftHigh,leftSum);
        FindMaxmumSubarry(Array,mid+1,high,rightLow,rightHigh,rightSum);
        FindMaxCrossingSubarray(Array,low,mid,high,crossLow,crossHigh,crossSum);

        if (leftSum>=rightSum&&leftSum>=crossSum)
        {    
            relow=leftLow;
            rehigh=leftHigh;
            resum=leftSum;
        }
        else if(rightSum>=leftSum&&rightSum>=crossSum)
        {
            relow=rightLow;
            rehigh=rightHigh;
            resum=rightSum;
        }
        else
        {
            relow=crossLow;
            rehigh=crossHigh;
            resum=crossSum;
        }
    }
}
原文地址:https://www.cnblogs.com/fastcam/p/4778367.html