【C++】数组的最大子数组
我已无法用语言来描述递归有多牛逼。
#include<iostream> #include<vector> #include<algorithm> using namespace std; int max_sub_array(vector<int>& data, int left, int right); int max_crossing_sub_array(vector<int>& data, int left, int mid, int right); int main() { vector<int> data = { 3,0,5,2,7,8,9,6,1 }; //获取序列元素个数 int length = 9; int left = 0; int right = 8; int sum = 0; sum = max_sub_array(data, left, right); cout << sum << " "; } int max_sub_array(vector<int> &data, int left, int right) { if (left >= right)//因为这个时候表示已经分解到只剩一个元素了,就是递归的终止条件,子数组的最大值就是元素本身,返回 { return data[left]; } else { //将序列一分为二获取中间位置 int mid = (left + right) / 2; int max_left, max_right, max_cross, Smax;//用来存储子数组的和 //分治 max_left = max_sub_array(data, left, mid);//左边子数组的和 max_right = max_sub_array(data, mid + 1, right);//右边子数组的和 //合并 max_cross = max_crossing_sub_array(data, left, mid, right);//跨越中心的子数组的和 Smax = max(max(max_left, max_right), max_cross); return Smax; } } int max_crossing_sub_array(vector<int>& data, int left, int mid, int right) { int left_max = -99999;//不可能达到的一个数 int right_max = -99999; int sum = 0; /*计算以mid结尾的最大的子数组和,左边子数组*/ for (int i = mid; i >= left; --i) { sum += data.at(i); if (sum > left_max) left_max = sum; } sum = 0; /*计算以mid+1开始的最大的子数组和,右边子数组*/ for (int i = mid + 1; i <= right; ++i) { sum += data.at(i); if (sum > right_max) right_max = sum; } return left_max + right_max; }