最大子数组问题

maxSubarray.cpp

 1 #define N -10000000
 2 
 3 class the_subarray_and_sum;
 4 the_subarray_and_sum find_max_crossing_subarray(int *, size_t, size_t, size_t);
 5 
 6 class the_subarray_and_sum {
 7 public:
 8     the_subarray_and_sum(size_t low = 0, size_t high = 0, int sum = 0) {}
 9     the_subarray_and_sum(const size_t l, const size_t h, const int s):
10         low(l), high(h), sum(s) {}
11     
12     int getsum() { return sum; }
13 
14     the_subarray_and_sum& operator=(const the_subarray_and_sum &rhs) {
15         low = rhs.low;
16         high = rhs.high;
17         sum = rhs.sum;
18     }
19 private:
20     size_t low;
21     size_t high;
22     int sum;
23 };
24 
25 the_subarray_and_sum 
26 find_max_crossing_subarray(int *arr, size_t high, size_t mid, size_t low)
27 {
28     int left_sum, right_sum;
29     left_sum = right_sum = N;
30 
31     int sum = 0;
32     size_t max_left, max_right;
33 
34     for (size_t i = mid; i != low; --i) {
35         sum += arr[i];
36         if (sum > left_sum) {
37             left_sum = sum;
38             max_left = i;
39         }
40     }
41     sum = 0;
42     for (size_t j = mid + 1; j != high; ++j) {
43         sum += arr[j];
44         if (sum > right_sum) {
45             right_sum = sum;
46             max_right = j;
47         }
48     }
49     return the_subarray_and_sum(max_left, max_right, left_sum + right_sum);
50 }
51 
52 the_subarray_and_sum
53 find_maximum_subarray(int *arr, size_t low, size_t high)
54 {
55     if (high == low)
56         return the_subarray_and_sum(low, high, arr[low]);
57     else {
58         size_t mid = (low + high) / 2;
59         the_subarray_and_sum sasl;
60         the_subarray_and_sum sash;
61         the_subarray_and_sum sasc;
62 
63         sasl = find_maximum_subarray(arr, low, mid);
64         sash = find_maximum_subarray(arr, mid + 1, high);
65         sasc = find_max_crossing_subarray(arr, low, mid, high);
66 
67         if (sash.getsum() < sasl.getsum() && sasc.getsum < sasl.getsum)
68             return sasl;
69         else if (sasl.getsum() < sash.getsum() && sasc.getsum < sash.getsum())
70             return sash;
71         else
72             return sasc;
73     }
74 }

 

posted @ 2015-09-18 16:03  JFanner  阅读(117)  评论(0)    收藏  举报