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

8 篇文章 0 订阅
#include<iostream>
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<<"子数组最大值:"<<sum_max<<endl;
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_sum1<mid_bs)
mid_sum1=mid_bs;
}
for(int i=mid+1;i<=high;++i)
{
mid_es+=a[i];
if(mid_sum2<mid_es)
mid_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);
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值