最大子数组问题
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); }
相关文章推荐
- js算法:max subarray question 求解最大子数组问题
- 小算法--最大子数组
- 分治算法--最大子数组
- 算法导论4.1-3~4.1-5最大子数组暴力算法和递归算法的实现和线性时间算法实现
- 最大子数组 java语言
- 最大子数组问题分治法(递归)Java实现
- 算法之求最大子数组
- 最大子数组之和
- LintCode: 最大子数组
- 最大子数组问题-GoLang实现
- Maximum subarray -- 最大子数组问题(C++)
- 分治法解决最大子数组问题 (C/C++)
- 求解最大子数组问题的三种方法
- 最大子数组的两种实现源码
- 最大子数组之暴力枚举法
- 分治算法-最大子数组问题
- Python实现求解最大子数组问题
- 算法导论_最大子数组问题(分治策略)
- 最大子数组问题
- 菜鸟系列之C/C++经典试题(二)