public class FindMaxSubarray
{
public static int findMaxCrossingSubarray(int[] a, int low, int mid, int high)
{
int left_sum = 0, right_sum = 0;
int sum = 0;
for (int i = mid; i >= 0; --i)
{
sum += a[i];
if (sum > left_sum)
{
left_sum = sum;
}
}
sum = 0;
for (int j = mid + 1; j <= high; ++j)
{
sum += a[j];
if (sum > right_sum)
{
right_sum = sum;
}
}
return left_sum + right_sum;
}
public static int findMaximumSubarray(int[] a, int low, int high)
{
int mid = 0;
int leftSum = 0, rightSum = 0, crossSum = 0;
if (high == low)
{
return a[low];
}
else
{
mid = low + (high - low) / 2;
leftSum = findMaximumSubarray(a, low, mid);
rightSum = findMaximumSubarray(a, mid + 1, high);
crossSum = findMaxCrossingSubarray(a, low, mid, high);
if (leftSum >= rightSum && leftSum >= crossSum)
{
return leftSum;
}
else if (rightSum >= leftSum && rightSum >= crossSum)
{
return rightSum;
}
else
return crossSum;
}
}
public static void main(String[] args)
{
int[] a = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};
int sum = findMaximumSubarray(a, 0, a.length - 1);
System.out.println(sum);
}
}
{
public static int findMaxCrossingSubarray(int[] a, int low, int mid, int high)
{
int left_sum = 0, right_sum = 0;
int sum = 0;
for (int i = mid; i >= 0; --i)
{
sum += a[i];
if (sum > left_sum)
{
left_sum = sum;
}
}
sum = 0;
for (int j = mid + 1; j <= high; ++j)
{
sum += a[j];
if (sum > right_sum)
{
right_sum = sum;
}
}
return left_sum + right_sum;
}
public static int findMaximumSubarray(int[] a, int low, int high)
{
int mid = 0;
int leftSum = 0, rightSum = 0, crossSum = 0;
if (high == low)
{
return a[low];
}
else
{
mid = low + (high - low) / 2;
leftSum = findMaximumSubarray(a, low, mid);
rightSum = findMaximumSubarray(a, mid + 1, high);
crossSum = findMaxCrossingSubarray(a, low, mid, high);
if (leftSum >= rightSum && leftSum >= crossSum)
{
return leftSum;
}
else if (rightSum >= leftSum && rightSum >= crossSum)
{
return rightSum;
}
else
return crossSum;
}
}
public static void main(String[] args)
{
int[] a = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};
int sum = findMaximumSubarray(a, 0, a.length - 1);
System.out.println(sum);
}
}