分治法求解最大数组
假如我们要寻找Array[LOW...high]的最大数组,使用分治法意味着我们要将数组划分成两个规模尽量相等的子数组,
也就是找到中央位置mid,然后求解Array[low,mid] 和Array[mid,high] ,Array[low...high] 的连续子数组Array[i..j]所处的位置必然只有三种情况:
--完全位于左侧数组
--完全位于右侧数组
--跨过中点
左右两侧又分别是最大子数组问题,只是规模更小,因此,剩下的全部工作就是寻找跨越中点的最大子数组
注意:跨过中点的情况每次都进行判断计算
- subArray_Data Find_Cross_Max_SubArray(int32_t array[],
- int32_t low, int32_t mid, int32_t high)
- {//查找跨越中点的最大数组
- int32_t left_sum = -2147483648;
- int32_t sum = 0;
- int32_t max_left = 0;
- for (int32_t _i = mid; _i >= low; _i--) {
- sum += array[_i];
- if (sum > left_sum)
- { left_sum = sum; max_left = _i;}
- }
- int32_t right_sum = -2147483648;
- sum = 0;
- int32_t max_right = 0;
- for (int32_t _i = mid + 1; _i <= high; _i++) {
- sum += array[_i];
- if (sum > right_sum)
- { right_sum = sum; max_right = _i; }
- }
- subArray_Data cross_Max_SubArray;
- cross_Max_SubArray.low = max_left;
- cross_Max_SubArray.high = max_right;
- cross_Max_SubArray.sum = left_sum + right_sum;
- return cross_Max_SubArray;
- }
- subArray_Data Find_Max_SubArray(int32_t array[],
- int32_t low, int32_t high)
- {//查找最大数组
- if (low == high) {
- subArray_Data Max_SubArray;
- Max_SubArray.low = low;
- Max_SubArray.high = high;
- Max_SubArray.sum = array[low];
- return Max_SubArray;
- }
- else
- {
- int32_t mid = (low + high) / 2;
- subArray_Data Left_Max_SubArray =
- Find_Max_SubArray(array,low,mid);
- subArray_Data Right_Max_SubArray =
- Find_Max_SubArray(array, mid + 1, high);
- subArray_Data Cross_Max_SubArray =
- Find_Cross_Max_SubArray(array, low, mid, high);
- if (Left_Max_SubArray.sum >= Right_Max_SubArray.sum &&
- Left_Max_SubArray.sum >= Cross_Max_SubArray.sum)
- return Left_Max_SubArray;
- else if (Right_Max_SubArray.sum >= Left_Max_SubArray.sum &&
- Right_Max_SubArray.sum >= Cross_Max_SubArray.sum)
- return Right_Max_SubArray;
- else return Cross_Max_SubArray;
- }
- }