最大子数组问题的分治算法

来源:互联网 发布:网络教育学籍保留几年 编辑:程序博客网 时间:2024/05/29 16:49
#include <iostream>#include <algorithm>#include <vector>using namespace std;/*最大子数组问题的分治算法*/#define INT32_MIN (1<<29)/** find a subarray crossing the mid with the biggist sum*/int find_max_crossing_subarray(vector<int> array, int low, int mid, int high){int left_maxsum = -50; //for sumint right_maxsum = -50; //for sumint sum = 0;for (int i = mid; i >= low; --i){sum += array[i];if (sum > left_maxsum){left_maxsum = sum;}}sum = 0;for (int i = mid + 1; i <= high; ++i){sum += array[i];if (sum > right_maxsum){right_maxsum = sum;}}return(left_maxsum + right_maxsum);//cout<<"maxsum_crossing_mid"<<left_maxsum+right_maxsum<<endl;}int max(int a, int b, int c){if (a >= b && a >= c)return a;else if (b >= a && b >= c)return b;elsereturn c;}/** find a subarray on the left or right side of mid*/int find_max_subarray(vector<int> array, int low, int high){if (low == high){return array[low];}int mid = int((low + high) / 2);int low_maxsum = find_max_subarray(array, low, mid);int high_maxsum = find_max_subarray(array, mid + 1, high);int crossing_mid_maxsum = find_max_crossing_subarray(array, low, mid, high);return max(low_maxsum, high_maxsum, crossing_mid_maxsum);}int main(){vector<int> array;for (int i = 0; i<10; i++){int j = 50 - rand() % 100; //-49~50array.push_back(j);}for (vector<int>::iterator it = array.begin(); it != array.end(); ++it){cout << *it << " ";}cout << endl;int maxsum = find_max_subarray(array, 0, array.size() - 1);cout << "the maxsum=" << maxsum << endl;return 0;}

原创粉丝点击