1、Θ(n2)算法
#include <stdio.h>
typedef struct {
int sum;
int left;
int right;
} subarray;
int main()
{
subarray max_subarray_n2(int [], int);
int a[] = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};
subarray result = max_subarray_n2(a, sizeof(a) / sizeof(a[0]));
printf("max-subarray info:left=%d,right=%d,sum=%d\n", result.left, result.right, result.sum);
return 0;
}
subarray max_subarray_n2(int a[], int length)
{
subarray result = {.sum = a[0], .left = 0, .right = 0};
for (int i = 0; i < length-1; ++i) {
int tmp_sum = a[i];
for (int j = i+1; j < length; ++j) {
tmp_sum += a[j];
if (tmp_sum > result.sum) {
result = (subarray){tmp_sum, i, j};
}
}
}
return result;
}
2、Θ(nlgn)算法
#include <stdio.h>
typedef struct {
int sum;
int left;
int right;
} subarray;
int main()
{
subarray max_subarray_nlgn(int [], int, int);
subarray find_max_crossing_subarray(int [], int, int);
int a[] = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};
subarray result = max_subarray_nlgn(a, 0, sizeof(a) / sizeof(a[0]) - 1);
printf("max-subarray info:left=%d,right=%d,sum=%d\n", result.left, result.right, result.sum);
return 0;
}
subarray find_max_crossing_subarray(int a[], int left, int right)
{
int mid = (left + right) / 2;
int max_left = mid, max_right = mid + 1;
int left_sum = a[mid], sum = 0;
for (int i = mid; i >= left; --i) {
sum += a[i];
if (sum > left_sum) {
max_left = i;
left_sum = sum;
}
}
sum = 0;
int right_sum = a[mid+1];
for (int i = mid+1; i <= right; ++i) {
sum += a[i];
if (sum > right_sum) {
max_right = i;
right_sum = sum;
}
}
return (subarray){left_sum + right_sum, max_left, max_right};
}
subarray max_subarray_nlgn(int a[], int left, int right)
{
if (left == right) {
return (subarray){a[left], left, right};
}
int mid = (left + right) / 2;
subarray left_array = max_subarray_nlgn(a, left, mid);
subarray crossing_array = find_max_crossing_subarray(a, left, right);
subarray right_array = max_subarray_nlgn(a, mid + 1, right);
if (left_array.sum > crossing_array.sum && left_array.sum > right_array.sum) {
return left_array;
} else if (crossing_array.sum > left_array.sum && crossing_array.sum > right_array.sum) {
return crossing_array;
} else {
return right_array;
}
}
3、Θ(n)算法
#include <stdio.h>
typedef struct {
int sum;
int left;
int right;
} subarray;
int main()
{
subarray max_subarray_n(int [], int);
int a[] = {13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7};
subarray result = max_subarray_n(a, sizeof(a) / sizeof(a[0]));
printf("max-subarray info:left=%d,right=%d,sum=%d\n", result.left, result.right, result.sum);
return 0;
}
subarray max_subarray_n(int a[], int length)
{
int left = 0, right = 0;
int temp_sum1 = a[0],sum = a[0];
int mid = -1, temp_sum2=0;
for (int i = 1; i < length; ++i) {
temp_sum1 += a[i];
if (temp_sum1 > sum) {
sum = temp_sum1;
right = i;
mid = -1;
temp_sum2 = 0;
continue;
} else if(a[i]>0 && mid == -1) {
mid=i;
}
if (mid != -1) {
if (temp_sum2 <=0 && a[i] > 0) {
mid=i;
temp_sum2 = a[i];
} else {
temp_sum2 += a[i];
}
}
if(temp_sum2 > sum) {
left = right = mid;
sum = temp_sum1 = temp_sum2;
mid = -1;
temp_sum2=0;
}
}
return (subarray){sum, left, right};
}