/**
* @Date: 2020-03-24
* @Description: 最大子数组问题算法(分治法 、 无左右下标)
*/
public static int maxSubArraySort(int a[], int low, int high) {
if (low > high) {
return 0;
}
if (low == high) {
return a[0];
}
int S_Left = 0, S_Right = 0, S_Cross_Left_Right = 0;
//while (low < high) {
int i = low;
int j = high;
int mid = (i + j) / 2;
S_Left = maxSubArraySort(a, i, mid);
S_Right = maxSubArraySort(a, mid + 1, j);
S_Cross_Left_Right = CrossLeftAndRight(a, i, mid, j);
//}
return maxInThreeNum(S_Left, S_Right, S_Cross_Left_Right);
}
public static int CrossLeftAndRight(int a[], int low, int mid, int high) {
int Sub_Left_Sum = Integer.MIN_VALUE;
int Sub_Left_Sum_Tem = 0;
for (int i = mid; i >= low; i--) {
Sub_Left_Sum_Tem += a[i];
if (Sub_Left_Sum_Tem > Sub_Left_Sum) {
Sub_Left_Sum = Sub_Left_Sum_Tem;
}
}
int Sub_Right_Sum = Integer.MIN_VALUE;
int Sub_Right_Sum_Tem = 0;
for (int i = mid + 1; i <= high; i++) {
Sub_Right_Sum_Tem += a[i];
if (Sub_Right_Sum_Tem > Sub_Right_Sum) {
Sub_Right_Sum = Sub_Right_Sum_Tem;
}
}
return Sub_Left_Sum + Sub_Right_Sum;
}