分治思想的求最大子数组和代码实现(C++)

来源:互联网 发布:阿里云如何升级配置 编辑:程序博客网 时间:2024/06/16 04:46

头文件

#pragma oncestruct 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;}


 

0 0
原创粉丝点击