1 #include"stdio.h"
2 int findMaxCrossingSubarray(int a[],int low,int high);
3 int findMaximumSubarray(int a[],int low,int high);
4 int maxLeft,maxRight;
5 int main()
6 {
7 int a[100] = {0,13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
8 int maxSum;
9 maxSum = findMaximumSubarray(a,1,16);
10 printf("%d %d\n",maxLeft,maxRight);
11 printf("%d\n",maxSum);
12 return 0;
13 }
14 int findMaxCrossingSubarray(int a[],int low,int high)
15 {
16 int i,j;
17 int mid;
18 int leftSum = -9999,rightSum = -9999;
19 int sum = 0;
20
21 mid = (low + high) / 2;
22 for(i = mid;i>=1;i--)
23 {
24 sum = sum + a[i];
25 if(sum > leftSum)
26 {
27 leftSum = sum;
28 maxLeft = i;
29 }
30 }
31 sum = 0;
32 for(j = mid +1;j<=high;j++)
33 {
34 sum = sum + a[j];
35 if(sum > rightSum)
36 {
37 rightSum = sum;
38 maxRight = j;
39 }
40 }
41 return leftSum + rightSum;
42 }
43 int findMaximumSubarray(int a[],int low,int high)
44 {
45 int mid;
46 int leftSum,crossSum,rightSum;
47 if(high == low)
48 return a[low];
49 else
50 {
51 mid = (low + high) / 2;
52 leftSum = findMaximumSubarray(a,low,mid);
53 rightSum = findMaximumSubarray(a,mid + 1,high);
54 crossSum = findMaxCrossingSubarray(a,low,high);
55 if(leftSum >= rightSum && leftSum >= crossSum)
56 return leftSum;
57 else if(rightSum >= leftSum && rightSum >= crossSum)
58 return rightSum;
59 else
60 return crossSum;
61 }
62 }