数组中子数组最大值----分治思想

#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);
}

你可能感兴趣的:(IT,算法)