您的位置:首页 > 编程语言 > Java开发

分治——最大子数组问题

2017-07-12 21:33 232 查看

代码

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),不再赘述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  分治 java 算法