#include
using namespace std;
// 求数组中子数组的最大值
// 参数1:数组,参数2:数组起始位置,参数3:数组尾位置的下一个位置
int MaxSum(int *,int,int);
int SelMaxValue(int,int,int); // 选择最大值
int Find_Max_Crossing_Value(int *,int,int,int);
int main()
{
const int cnt=6;
int sum_max=INT_MIN;
int A[cnt]={0,-2,3,5,-1,2};
int LEN_A=sizeof(A)/sizeof(int);
sum_max=MaxSum(A,0,LEN_A-1); // 求子数组的最大值
cout<<"子数组最大值:"<system("pause");
return 0;
}
// 原数组最大子段三种情况:1.和数组前一半最大子段和相同2,和数组后一半最大子段和相同
// 3.和跨过其中中间两个元素a[n/2-1]和a[n/2]
int MaxSum(int *a,int low,int high)
{
int beg_max=0,mid_max=0,end_max=0;
int mid_bs=0,mid_es=0;
int midval=0;
if (low==high)
{
return a[low];
}
else{
midval=(high+low)/2;
beg_max=MaxSum(a,low,midval); // 前半数组子数组的最大值
end_max=MaxSum(a,midval+1,high); // 后半数组子数组的最大值
mid_max=Find_Max_Crossing_Value(a,low,midval,high);
return SelMaxValue(beg_max,mid_max,end_max);
}
}
// 跨过其中中间两个元素a[n/2-1]和a[n/2]的最大值
int Find_Max_Crossing_Value(int *a,int low,int mid,int high)
{
int mid_bs=0,mid_es=0;
int mid_sum1=INT_MIN,mid_sum2=INT_MIN;
for(int i=mid;i>=low;--i)
{
mid_bs+=a[i];
if (mid_sum1mid_sum1=mid_bs;
}
for(int i=mid+1;i<=high;++i)
{
mid_es+=a[i];
if(mid_sum2mid_sum2=mid_es;
}
return (mid_sum1+mid_sum2);
}
int SelMaxValue(int iv1,int iv2,int iv3) // 选择最大值
{
return (iv1>iv2)?(iv1>iv3?iv1:iv3):(iv2>iv3?iv2:iv3);
}