您的位置:首页 > 其它

最大子数组问题

2016-07-08 11:53 162 查看
#include<iostream>//使用时,请使用Maxarray函数
using namespace std;
int max(int a,int b,int c)//返回三个数中最大者。
{
return a>b?(a>c?a:c):(b>c?b:c);
}
void f(int *low,int len,int max0)//参数分别为:数组首地址,数组长度,目前求得的最大值
{
int i,j,x=0,y=0,t=0,sum1=0,sum2=0,max1=0,max2=0,max3=0;
if(len%2) t=1;//如果长度为奇数,那么后半段就比前半段长1。
for(i=len/2-1;i>=0;i--)//从中间往前求和。
{
sum1+=low[i];
if(sum1>max1)
{
max1=sum1;
x=i;
}
}
for(j=0;j<len/2+t;j++)//从中间往后求和。
{
sum2+=low[j+len/2];
if(sum2>max2)
{
max2=sum2;
y=j;
}
}
max3=max1+max2;//max3为跨越中点的最大和。
if(max0>max(max1,max2,max3))//当此次寻找到的最大和比上次找到的小,就结束递归。
return;
cout<<"最大子数组的区间为("<<x<<","<<x+y+1<<")"<<endl;
cout<<"最大和为"<<max(max1,max2,max3)<<endl;
if(max(max1,max2,max3)==max1)//如果最大和产生在前半段,那么在前半段再次寻找。
f(low+x,len/2-x,max1);
else if(max(max1,max2,max3)==max2)//如果最大和产生在后半段,那么在后半段再次寻找。
f(low+len/2,y,max2);
else if(max(max1,max2,max3)==max3)//如果最大和产生在跨越中点的部分,那么就在跨越中点的部分再次寻找。
f(low+x,len/2-x+y,max3);
}
void Maxarray(int *low,int len)//为了使用方便,把第三个参数设置在最大子数组的主要函数内,这样使用时就只需输入两个参数了
{
f(low,len,0);
}
int main()
{
int a[]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
Maxarray(a,16);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最大子数组