最大子树问题(The maximum-subarray problem)

来源:互联网 发布:node 开发流程 编辑:程序博客网 时间:2024/05/04 01:01

最大子树问题(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");}


0 0