Complier: gcc 4.7.3
C++0x
(1) Time Complexicity: O(nlgn)
1 #include <iostream>
2 #include <tuple>
3
4 using namespace std;
5
6 tuple<const size_t, const size_t, const int>
7 Find_Max_Crossing_Subarray(int ia[], const size_t low,
8 const size_t mid, const size_t high){
9
10 int left_sum = 0, right_sum = 0;
11 int sum = 0;
12 int max_left = 0, max_right = 0;
13
14 if(high - low == 1) {
15 return make_tuple(low, high, ia[low - 1] + ia[high - 1]);
16 }
17
18 for(int i = mid - 1; i != low - 2; --i) {
19 sum += ia[i];
20 if(sum > left_sum) {
21 left_sum = sum;
22 max_left = i + 1;
23 }
24 }
25
26 //Clear the sum calculated before.
27 sum = 0;
28
29 for(int j = mid; j != high; ++j) {
30 sum += ia[j];
31 if(sum > right_sum) {
32 right_sum = sum;
33 max_right = j + 1;
34 }
35 }
36
37 return make_tuple(max_left, max_right, left_sum + right_sum);
38 }
39
40 tuple<const size_t, const size_t, const int>
41 Find_Maximum_Subarray(int ia[], const size_t low, const size_t high) {
42 if(low == high) {
43 return make_tuple(low - 1, high - 1, ia[low - 1]);
44 }
45 else {
46 const size_t mid = (low + high) / 2;
47
48 tuple<const size_t, const size_t, const int>
49 left_max_subarray = Find_Maximum_Subarray(ia, low, mid);
50
51 tuple<const size_t, const size_t, const int>
52 right_max_subarray = Find_Maximum_Subarray(ia, mid + 1, high);
53
54 tuple<const size_t, const size_t, const int>
55 cross_max_subarray = Find_Max_Crossing_Subarray(ia, low, mid, high);
56
57 int left_sum = get<2>(left_max_subarray);
58 int right_sum = get<2>(right_max_subarray);
59 int cross_sum = get<2>(cross_max_subarray);
60
61 if(left_sum >= right_sum && left_sum >= cross_sum) {
62 return left_max_subarray;
63 }
64 else {
65 if(right_sum >= left_sum && right_sum >= cross_sum) {
66 return right_max_subarray;
67 }
68 else {
69 return cross_max_subarray;
70 }
71 }
72 }
73 }
74
75 int main() {
76 int ia[] = {13, -3, -25, 20, -3, -16, -23, 18,
77
78 20, -7, 12, -5, -22, 15, -4, 7};
79 cout << "The original array ia is: " << endl;
80
81 const size_t size = sizeof(ia)/sizeof(int);
82
83 for(size_t i = 0; i != size; ++i) {
84 cout << ia[i] << " ";
85 }
86 cout << endl;
87
88 tuple<const size_t, const size_t, const int>
89 arr = Find_Maximum_Subarray(ia, 1, size);
90 cout << get<0>(arr) << " " << get<1>(arr) << " " << get<2>(arr) << endl;
91 return EXIT_SUCCESS;
92 }
(2) Time Complexicity: O(n)
1 #include <iostream>
2
3 using namespace std;
4
5 int Max_Subarray(int ia[], const size_t n) {
6 int sum = 0;
7
8 //using -255 as -INFINITY
9 int max_sum = -255;
10 for(size_t i = 0; i != n; ++i) {
11 sum += ia[i];
12
13 if(sum > max_sum) {
14 max_sum = sum;
15 begin = end = i;
16 }
17
18 if(sum < 0) {
19 sum = 0;
20 }
21 }
22 return max_sum;
23 }
24
25 int main() {
26
27 int ia[] = {13, -3, -25, 20, -3, -16, -23, 18,
28 20, -7, 12, -5, -22, 15, -4, 7};
29
30 int max_sum = Max_Subarray(ia, sizeof(ia)/sizeof(int));
31
32 cout << max_sum << endl;
33
34
35 return EXIT_SUCCESS;
36 }
37