/**
* 最大子数组问题 采用分治策略
* @author wu
*
*/
public class
FindMaxMumSubarray {
returnParameter rtP=new
returnParameter();
returnParameter rtPleft=new
returnParameter();
returnParameter rtPRight=new
returnParameter();
returnParameter rtPCorss=new
returnParameter();
public returnParameter FindMaxMumSubbarray1(int
a[],int low,int high){
int mid;
if(low==high){//there is only one
element in array
a[]
rtP.sum=a[low];
rtP.low=low;
rtP.high=high;
rtP.print();
return
rtP;
}
else{
mid=(low+high)/2;
System.out.println("(1)");
rtPleft=
FindMaxMumSubbarray1(a, low,
mid);
System.out.println("(2)");
rtPRight=FindMaxMumSubbarray1(a,
mid+1,
high);
System.out.println("(3)");
rtPCorss=FindMaxCorssingSubarray(a,low,mid,high);
if(rtPleft.sum>=rtPCorss.sum
&&
rtPleft.sum>=rtPRight.sum){
rtPleft.print();
return
rtPleft;
}
else if(rtPRight.sum>=rtPleft.sum &&
rtPRight.sum>=rtPCorss.sum){
rtPRight.print();
return
rtPRight;
}
else{
rtPCorss.print();
return
rtPCorss;
}
}
}
private returnParameter FindMaxCorssingSubarray(int[] a, int low, int mid,
int high) {
returnParameter rtp=new returnParameter();
int max_left =
0,max_right = 0;
int left_sum=(int) -9.99e20;
int sum=0;
for(int
i=mid;i>=low;i--){
sum+=a[i];
if(sum>left_sum){
left_sum=sum;
max_left=i;
}
}
int
right_sum=(int) -9.99e20;
int sum1=0;
for(int
j=mid+1;j<=high;j++){
sum1+=a[j];
if(sum1>right_sum){
right_sum=sum1;
max_right=j;
}
}
rtp.low=max_left;
rtp.high=max_right;
rtp.sum=left_sum+right_sum;
return
rtp;
}
}
原文:http://www.cnblogs.com/java-wgm/p/3614468.html