头文件
#pragma once
struct Max_Sum_Rusult
{
int sum;
int left;
int rigth;
};
class find_MaxSum_SubArray
{
public:
static Max_Sum_Rusult getMaxSumOfSubArray(int *a,int left,int right);//提供给外部调用的函数
private:
//求跨越中间结点的最大值
static Max_Sum_Rusult _getMaxOfSubArrayAboutCrossing(int *a,int left,int mid,int right);
static Max_Sum_Rusult _getResult(int left,int right,int sum);
};
代码实现
#include "stdafx.h"
#include "find_MaxSum_SubArray.h"
#include <limits>
Max_Sum_Rusult find_MaxSum_SubArray::getMaxSumOfSubArray(int *a,int left,int right)
{
if (left == right)
{
return _getResult(left,right,a[left]);
}
int mid = (left+right)/2;
Max_Sum_Rusult leftResult = getMaxSumOfSubArray(a,left,mid);
Max_Sum_Rusult rightResult = getMaxSumOfSubArray(a,mid+1,right);
Max_Sum_Rusult crossResult = _getMaxOfSubArrayAboutCrossing(a,left,mid,right);
Max_Sum_Rusult maxResult = leftResult.sum >rightResult.sum ? leftResult : rightResult;
maxResult = maxResult.sum >crossResult.sum ? maxResult : crossResult;
return maxResult;
}
Max_Sum_Rusult find_MaxSum_SubArray::_getMaxOfSubArrayAboutCrossing(int *a,int left,int mid,int right)
{
int leftSum =INT_MIN;
int rigthSum = INT_MIN;
int i,sum;
int max_left,max_rigth;
for (sum =0,i= mid;i>=left;--i)
{
sum += a[i];
if (leftSum<sum)
{
leftSum = sum;
max_left = i;
}
}
for (sum = 0,i= mid+1;i<=right;++i)
{
sum += a[i];
if (rigthSum<sum)
{
rigthSum = sum;
max_rigth = i;
}
}
return _getResult(max_left,max_rigth,leftSum+rigthSum);
}
Max_Sum_Rusult find_MaxSum_SubArray::_getResult(int left,int right,int sum)
{
Max_Sum_Rusult result;
result.left = left;
result.rigth = right;
result.sum = sum;
return result;
}