算法导论最大子数组问题

 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 }
原文地址:https://www.cnblogs.com/guochangyu/p/7725286.html