package com.sort.divid;
/**
* 求最大子数组
* @author Administrator
*nlogn
*/
public class MaxSubArray {
private static int[] findMaxCrossSubArray(int [] data,int left,int middle,int right){
int [] result=new int[3];
int leftmax=data[middle];
int sum=leftmax;
int leftIndex=middle;
for(int i=middle-1;i>=left;i--){
sum=sum+data[i];
if(sum>leftmax){
leftmax=sum;
leftIndex=i;
}
}
int rightmax=data[middle+1];
sum=rightmax;
int rightIndex=middle+1;
for(int i=middle+2;i<=right;i++){
sum=sum+data[i];
if(sum>rightmax){
rightmax=sum;
rightIndex=i;
}
}
result[0]=leftmax+rightmax;
result[1]=leftIndex;
result[2]=rightIndex;
return result;
}
private static int[] findMaxSubArray(int []data,int left,int right){
int [] result=new int[3];
if(left==right){
result[0]=data[left];
result[1]=left;
result[2]=right;
return result;
}
int middle=(left+right)/2;
int[] leftResult=findMaxSubArray(data,left,middle);
int [] rightResult=findMaxSubArray(data,middle+1,right);
int []crossResult=findMaxCrossSubArray(data,left,middle,right);
if(leftResult[0]>rightResult[0]&&leftResult[0]>crossResult[0]){
return leftResult;
}else if(rightResult[0]>leftResult[0]&&rightResult[0]>crossResult[0]){
return rightResult;
}else{
return crossResult;
}
}
public static void main(String[] args) {
int[] data=new int[]{-1,2,9,11,-20,9,6,22,-8,9,1};
for(int i=0;i<data.length;i++){
System.out.print(data[i]+" ");
}
System.out.println();
int []result=findMaxSubArray(data,0,data.length-1);;
for(int i=0;i<result.length;i++){
System.out.print(result[i]+" ");
}
System.out.println();
}
}