最大子数组问题
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 }

浙公网安备 33010602011771号