最大子数组问题(分而治之求解)

最大子数组问题:

在一个数列当中寻找一个子数列,使得这个子数列的元素之和最大。为了使代码简单化,在这里我们只求出最大值。

以数组 X[12]={1,-2,4,5,-2,8,3,-2,6,3,7,-1} 为例:

先分

最大子数组问题(分而治之求解)_第1张图片

 再和并治之

最大子数组问题(分而治之求解)_第2张图片

 

#include
#define n -100
using namespace std;
int CrossingSubArray(int X[],int low,int mid,int high)
{
	int Sleft=n,Sright=n;
	int sum=0;
	for(int l=mid;l>=low;l--)   //求从mid开始往左的最大值 
	{
		sum=sum+X[l];
		if(sum>Sleft)
		Sleft=sum;
	}
	sum=0;
	for(int r=mid+1;r<=high;r++)  //求从mid+1开始往右的最大值 
	{
		sum=sum+X[r];
		if(sum>Sright)
		Sright=sum;
	}
	return Sleft+Sright;     //中间最大值 
}
int Max(int x,int y,int z) //求三个数最大值 
{
	if(x>=y&&x>=z)
	return x;
	if(y>=x&&y>=z)
	return y;
	if(z>=x&&z>=y)
	return z;
}
int MaxSubArray(int X[],int low,int high) //递归求解 
{
	if(low==high)
	return X[low];
	else
	{
		int mid=(low+high)/2;
		int S1=MaxSubArray(X,low,mid);          //左子序列的最大值 
		int S2=MaxSubArray(X,mid+1,high);       //右子序列的最大值
		int S3=CrossingSubArray(X,low,mid,high);//中间子序列的最大值
		return Max(S1,S2,S3); //三者最大值 
	}	
} 
int main()
{
	int X[12]={1,-2,4,5,-2,8,3,-2,6,3,7,-1};
	cout<

运行结果为:32

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