代码
public class Max {
private static int max ( int [] a, int left, int right ){
//如果只有一个元素
if ( left == right )
if ( a[left] > 0 )
return a[left];
else return 0;
//以下分解递归
int mid = ( left + right ) / 2;
int leftSum = max( a, left, mid );
int rightSum = max( a, mid + 1, right );
//求跨越中轴的最大值
int leftMax = 0, leftBorder = 0;
for ( int i = mid; i >= left; i--) {
leftBorder += a[i];
if ( leftBorder > leftMax )
leftMax = leftBorder;
}
int rightMax = 0, rightBorder = 0;
for ( int i = mid + 1; i <= right; i++) {
rightBorder += a[i];
if ( rightBorder > rightMax )
rightMax = rightBorder;
}
int crossingSum = leftMax + rightMax;
//返回三者最大值
return max3( crossingSum, leftSum, rightSum );
}
private static int max3( int crossingSum, int leftSum, int rightSum ) {
int max = leftSum > rightSum ? leftSum : rightSum;
max = max > crossingSum ? max : crossingSum;
return max;
}
//测试
public static void main( String [] args) {
int [] a = { 4, -3, 5, -2, -1, 2, 6, -2};
System.out.print( max( a, 0, a.length - 1 ) );
}
}
输出结果
11
分治算法简要分析
列出递归式 T(n) = 2T(n/2) + θ(n) ,
可以使用递归树、主方法等算出时间即 θ(n log n),不再赘述。