//考虑最最大子数组穿过了中间元素mid
function Find_crossing_Subarray(arr,low,mid,high){
var left_sum=Number.NEGATIVE_INFINITY;
var right_sum=Number.NEGATIVE_INFINITY;
var sum_l=0,sum_r=0;
var max_left,max_right;
for(var i=mid;i>=low;i--){
sum_l=sum_l+arr[i];
if(sum_l>left_sum){
left_sum=sum_l;
max_left=i;
}
}
for(var i=mid+1;i<high;i++){
sum_r=sum_r+arr[i];
if(sum_r>right_sum){
right_sum=sum_r;
max_right=i;
}
}
return left_sum+right_sum;
}
//求最大子数组的代码
function Find_Max_Subarray(arr,low,high){
var left_max,right_max,crossing_max;
if(low==high){
return arr[low];
}
else {
var mid=Math.floor((low+high)/2);
//递归求出mid左边的最大子数组元素之和
left_max=Find_Max_Subarray(arr, low,mid);
//递归求出mid右边的最大子数组元素之和
righ_max=Find_Max_Subarray(arr,low+1,high);
//求出穿过mid时的情况
crossing_max=Find_crossing_Subarray(arr,low,mid,high);
//比较找出三者最大的。
if(left_max>right_max&&left_max>crossing_max){
return left_max;
}
else if(right_max>left_max&&right_max>crossing_max){
return right_max;
}
else return crossing_max;
}
}