int[] a ={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};最大子数组为a[7]~a[10] 和为43
一下为java实现,分治法,递归实现;
public class MaxSubarray {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
Result result = findMaxSubarray(a, 0, 15);
System.out.println(result.getLow()+" "+result.getHigh()+" "+result.getSum());
}
static Result findMaxCrossingSubarray(int[] a, int low ,int mid, int high){
Result result = new Result();
int leftSum = -2147483648;
int sum = 0;
for(int i = mid; i>=low ; i--){
sum += a[i];
if(sum > leftSum){
leftSum = sum;
result.setLow(i);
}
}
int rightSum = -2147483648;
sum = 0;
for(int i = mid+1; i<=high ; i++){
sum += a[i];
if(sum > rightSum){
rightSum = sum;
result.setHigh(i);
}
}
result.setSum(leftSum+rightSum);
return result;
}
static Result findMaxSubarray(int[] a, int low ,int high){
if(low == high){
Result result = new Result();
result.setLow(low);
result.setHigh(high);
result.setSum(a[low]);
return result;
}
else{
int mid = (high+low)/2;
Result leftResult = findMaxSubarray(a, low, mid);
Result rightResult = findMaxSubarray(a, mid+1, high);
Result crossResult = findMaxCrossingSubarray(a, low, mid, high);
if(leftResult.getSum() >= rightResult.getSum() && leftResult.getSum() >= crossResult.getSum()){
return leftResult;
}else if(rightResult.getSum() >= leftResult.getSum() && rightResult.getSum() >= crossResult.getSum()){
return rightResult;
}else{
return crossResult;
}
}
}
}
public class Result { private int low; private int high; private int sum; public int getLow() { return low; } public int getHigh() { return high; } public int getSum() { return sum; } public void setLow(int low) { this.low = low; } public void setHigh(int high) { this.high = high; } public void setSum(int sum) { this.sum = sum; } }
更多实现方法,参看:
http://blog.csdn.net/v_JULY_v/article/details/6444021
http://www.cnblogs.com/waytofall/archive/2012/04/10/2439820.html