typedef struct Result{
int sum;
int low;
int high;
} result;
//找到跨越中点的最大子数组
result findMAxCrossingSubarray(int a[],int low,int mid,int high){
result result1;
int left_sum=a[mid],sum=0,max_left=mid;
for(int i=mid;i>=low;i--){
sum=sum+a[i];
if(sum>left_sum){
left_sum=sum;
max_left=i;
}
}
int right_sum=a[mid+1],max_right=mid+1;
sum=0;
for(int j=mid+1;j<=high;j++){
sum=sum+a[j];
if(sum>right_sum){
right_sum=sum;
max_right=j;
}
}
result1.low=max_left;
result1.high=max_right;
result1.sum=right_sum+left_sum;
return result1;
}
result findMaximumSubarray(int a[],int low,int high){
result result2;
if (high==low) {
result2.low = low;
result2.high = high;
result2.sum = a[low];
return result2;
}
int mid=(low+high)/2;
result result3=findMaximumSubarray(a,low,mid); //找到左边子数组的最大子数组
result result4=findMaximumSubarray(a,mid+1,high);//找到右边子数组的最大子数组
result result5=findMAxCrossingSubarray(a,low,mid,high);
if(result3.sum>result4.sum&&result3.sum>result5.sum)
return result3;
else if(result4.sum>result3.sum&&result4.sum>result5.sum)
return result4;
else
return result5;
}
int main( )
{
int a[]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
result result6 =findMaximumSubarray(a,0,15);
cout<<result6.low<<" "<<result6.high<<" "<<result6.sum<<endl;
return 0;
}
时间复杂度O(nlgn)