cs
#include<stdio.h>
#include<stdlib.h>
//分治法
//最大子段问题
int Maxsubsum(int* Array, int left, int right)
{
int sum = 0,i;
//当array只有一个元素的时候
if (left == right)
{
if (Array[left] > 0) {
sum = Array[left];
}
else
{
sum = 0;
}
}
else
{
int center = (left + right) / 2;
int leftsum = Maxsubsum(Array, left, center);
int rightsum = Maxsubsum(Array, center + 1, right);
int s1 = 0;
int lefts = 0;
for (i = center;i >= left; i--)
{
lefts = lefts + Array[i];
if (lefts>s1)
{
s1 = lefts;
}
}
int s2 = 0;
int rights = 0;
for (i = center + 1; i <= right; i++)
{
rights = rights + Array[i];
if (rights>s2)
{
s2 = rights;
}
}
sum = s1 + s2;//最大子段问题的第三种情况
//第一种情况
if (sum < leftsum)
{
sum = leftsum;
}
//第二种情况
if (sum < rightsum)
{
sum = rightsum;
}
}
return sum;
}
int main()
{
int* Array = (int*)malloc(6 * sizeof(int));
Array[0] = -2;
Array[1] = 11;
Array[2] = -4;
Array[3] = 13;
Array[0] = -5;
Array[0] = -2;
int result = Maxsubsum(Array, 0, 5);
printf("%d", result);
return 0;
}

时间复杂度为:O(nlogn)