最大子树问题(The maximum-subarray problem) Introduction to Algorithms Chapter4.1
通俗的说就是在一堆有正有负的数中找出连续的一组数字,使它们的和最大。
The maximum-subarray problem is interesting only when the array contains some negative numbers. If all the array entries were nonnegative, then the maximum-subarray problem would present no challenge, since the entire array would give the greatest sum.
这是最大子树问题 Θ(nlgn) 的C语言实现代码
#include<stdio.h>
typedef struct
{
int maxLeft;
int maxRight;
int sum;
}Cross;
Cross find_max_crossing_subarray(int a[],int low,int mid,int high)
{ //为了返回多个值,用了结构体
Cross cross;
int leftSum,rightSum;
int sum=0;
cross.maxLeft=0;
cross.maxRight=0;
for(int i=mid;i>=0;i--)
{
sum+=a[i];
if(sum>leftSum)
{
leftSum=sum;
cross.maxLeft=i;
}
}
sum=0;
for(i=mid+1;i<=high;i++)
{
sum+=a[i];
if(sum>rightSum)
{
rightSum=sum;
cross.maxRight=i;
}
}
cross.sum=leftSum+rightSum;
return cross;
}
Cross find_max_subarray(int a[],int low,int high)
{
Cross cross,crossLeft,crossRight;
if(high==low)
{
cross.maxLeft=low;
cross.maxRight=high;
cross.sum=a[low];
return cross;
}
else
{
int mid=(low+high)/2;
crossLeft=find_max_subarray(a,low, mid);
crossRight=find_max_subarray(a,mid+1, high);
cross=find_max_crossing_subarray(a,low,mid,high);
if(crossLeft.sum>=crossRight.sum&&crossLeft.sum>=cross.sum)
return crossLeft;
else if(crossRight.sum>=crossLeft.sum&&crossRight.sum>=cross.sum)
return crossRight;
else
return cross;
}
}
void main()
{
int a[10]={2,-5,8,-7,6,9,0,-3,1,-4};
Cross cross;
cross=find_max_subarray(a,0,9);
printf("第%d~%d个数的和最大,为:%d",cross.maxLeft+1,cross.maxRight+1,cross.sum);
printf("\n");
}