#include <stdio.h>
#include <limits.h>
int find_max_crossing_subarray(int arr[], int low, int mid, int high, int *left_or_right_low, int *left_or_right_high)
{
int left_sum = INT_MIN;
int right_sum = INT_MIN;
int sum = 0;
int i = 0;
int max_left;
int max_right;
for (i = mid; i >= low; i--){
sum += arr[i];
if (sum > left_sum){
left_sum = sum;
max_left = i;
}
}
sum = 0;
for (i = mid + 1; i <= high; i++){
sum += arr[i];
if (sum > right_sum){
right_sum = sum;
max_right = i;
}
}
*left_or_right_low = max_left;
*left_or_right_high = max_right;
return left_sum + right_sum;
}
int find_maximum_subarray(int arr[], int low, int high, int *left_or_right_low, int *left_or_right_high)
{
int mid;
int left_sum;
int right_sum;
int cross_sum;
int left_low, left_high, right_low, right_high, cross_low, cross_high;
if (low == high){
return arr[low];
}
else{
mid = (low + high) / 2;
left_sum = find_maximum_subarray(arr, low, mid, &left_low, &left_high);
right_sum = find_maximum_subarray(arr, mid + 1, high, &right_low, &right_high);
cross_sum = find_max_crossing_subarray(arr, low, mid, high, &cross_low, &cross_high);
if (left_sum >= right_sum && left_sum >= cross_sum){
*left_or_right_low = left_low;
*left_or_right_high = left_high;
return left_sum;
}
else if (right_sum >= left_sum && right_sum >= cross_sum){
*left_or_right_low = right_low;
*left_or_right_high = right_high;
return right_sum;
}
else{
*left_or_right_low = cross_low;
*left_or_right_high = cross_high;
return cross_sum;
}
}
}
int main(void)
{
int arr[16] = { 13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7 };
int left = 0;
int right = 0;
int sum = 0;
sum = find_maximum_subarray(arr, 0, 15, &left, &right);
printf("%d--%d : %d\n", left, right, sum);
return 0;
}
算法导论 分治1 最大子数组和
最新推荐文章于 2022-03-22 11:17:26 发布