用分治法求最大子序列问题,时间复杂度O(N*logN)

时间:2021-05-28 17:08:08
 
 
package Test;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class MaxSubSequenceSum {		public static void main(String[] args) throws IOException {		// TODO Auto-generated method stub		System.out.println("请输入10个数字,以空格隔开");		BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));		String s=bufr.readLine();		String[] s1=s.split("\\s+");		int[] a=new int[s1.length];		for(int i=0;i<s1.length;i++)	{			a[i]=Integer.parseInt(s1[i]);		}		int max=maxSumRec(a,0,a.length-1);		System.out.println(max);	}	/**	 * 《数据结构与算法分析》书中算法代码实现	 * 分治法求子序列最大和,体现递归的优点,时间复杂度O(N*logN)	 */	private static int maxSumRec(int[] a, int left, int right) {		// TODO Auto-generated method stub		if(left==right){			return a[left];		}		int center=(left+right)/2;		int maxLeftSum=maxSumRec(a,left,center);		System.out.println("maxLeftSum:"+maxLeftSum);		int maxRightSum=maxSumRec(a,center+1,right);		System.out.println("maxRightSum:"+maxRightSum);		int maxLeftBorderSum=0,leftBorderSum=0;		for(int i=center;i>=left;i--){			leftBorderSum +=a[i];			if(leftBorderSum>maxLeftBorderSum)				maxLeftBorderSum=leftBorderSum;		}						int maxRightBorderSum=0,RightBorderSum=0;		for(int i=center+1;i<=right;i++){			RightBorderSum +=a[i];			if(RightBorderSum>maxRightBorderSum)				maxRightBorderSum=RightBorderSum;		}		return max3(maxLeftSum,maxRightSum,maxLeftBorderSum+maxRightBorderSum);			}	//比较三个值返回最大值	private static int max3(int maxLeftSum, int maxRightSum, int i) {		// TODO Auto-generated method stub		int temp=0;		temp=(maxLeftSum>maxRightSum)?maxLeftSum:maxRightSum;		return (temp>i)?temp:i;	}}