Algorithmic Implementation series(4) Implementation of Maximum Subarray problem(O(nlgn) and O(n))

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 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值