public class MaxSubArray {
public static void main(String[] args) {
new MaxSubArray().start();
}
public void start() {
int[] array = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
SubArrayInfo subarrayinfo = getMaxSubArray(array,0,array.length-1);
for(int i=subarrayinfo.getLeft_index();i<=subarrayinfo.getRight_index();i++) {
System.out.print(array[i]+" ");
}
System.out.println();
System.out.println(subarrayinfo.getSum());
}
private SubArrayInfo getMaxSubArray(int[] array, int low, int high) {
SubArrayInfo leftarrayinfo = new SubArrayInfo(0,0,0);
SubArrayInfo crossarrayinfo = new SubArrayInfo(0,0,0);
SubArrayInfo rightarrayinfo = new SubArrayInfo(0,0,0);
if(low == high) {
leftarrayinfo.setLeft_index(low);
leftarrayinfo.setRight_index(high);
leftarrayinfo.setSum(array[low]);
return leftarrayinfo;
}
else {
int mid=(low + high)/2;
leftarrayinfo = getMaxSubArray(array,low,mid);
rightarrayinfo = getMaxSubArray(array,mid+1,high);
crossarrayinfo = getCrossSubArray(array,low,mid,high);
}
if(leftarrayinfo.getSum() >= rightarrayinfo.getSum() &&
leftarrayinfo.getSum() >= crossarrayinfo.getSum() ) {
return leftarrayinfo;
}
else if(rightarrayinfo.getSum() >= leftarrayinfo.getSum() && rightarrayinfo.getSum() >= crossarrayinfo.getSum()) {
return rightarrayinfo;
}
else {
return crossarrayinfo;
}
}
private SubArrayInfo getCrossSubArray(int[] array, int low, int mid, int high) {
int left_sum = -1000,right_sum = -1000;
SubArrayInfo subarrayinfo= new SubArrayInfo(0,0,0);
for(int i=mid,sum=0;i>=low;i--) {
sum += array[i];
if(sum > left_sum) {
left_sum = sum;
subarrayinfo.setLeft_index(i);
}
}
for(int i=mid+1,sum=0;i<=high;i++) {
sum += array[i];
if(sum > right_sum) {
right_sum = sum;
subarrayinfo.setRight_index(i);
}
}
subarrayinfo.setSum(left_sum+right_sum);
return subarrayinfo;
}
private class SubArrayInfo {
private int sum=0;
private int left_index=0;
private int right_index=0;
public SubArrayInfo(int sum, int left_index, int right_index) {
this.sum = sum;
this.left_index = left_index;
this.right_index = right_index;
}
public int getSum() {
return sum;
}
public void setSum(int sum) {
this.sum = sum;
}
public int getLeft_index() {
return left_index;
}
public void setLeft_index(int left_index) {
this.left_index = left_index;
}
public int getRight_index() {
return right_index;
}
public void setRight_index(int right_index) {
this.right_index = right_index;
}
}
}
运行结果为:
18 20 -7 12
43