编程之美-数组的最大值和最小值-分治法(两种形式)


import java.util.Arrays;

public class MinMaxInArray {

	/**
	 * 编程之美 数组的最大值和最小值 分治法
	 * 两种形式
	 */
	public static void main(String[] args) {
		int[] t={11,23,34,4,6,7,8,1,2,23};
		int[] re=new int[2];
		minMax(t,0,t.length-1,re);
		System.out.println(Arrays.toString(re));
		re=minMax2(t,0,t.length-1);
		System.out.println(Arrays.toString(re));
	}

	//C语言可以传递int& max,int& min.Java不行,用数组代替
	public static void minMax(int[] a,int s,int e,int[] result){
		if(!isValidParam(a,s,e)){
			return;
		}
		if(s>e){
			return;
		}
		if(s==e){
			result[0]=a[s];
			result[1]=a[s];
			return;
		}
		int min=0;
		int max=0;
		if(s+1==e){
			if(a[s]<a[e]){
				min=a[s];
				max=a[e];
			}else{
				max=a[s];
				min=a[e];
			}
			result[0]=min;
			result[1]=max;
			return;
		}
		
		int[] resultA=new int[2];
		int[] resultB=new int[2];
		
		int mid=s+(e-s)/2;
		minMax(a,s,mid,resultA);
		minMax(a,mid+1,e,resultB);
		min=resultA[0]<resultB[0]?resultA[0]:resultB[0];
		max=resultA[1]>resultB[1]?resultA[1]:resultB[1];
		result[0]=min;
		result[1]=max;
		
	}
	
	
	public static int[] minMax2(int[] a,int s,int e){
		if(!isValidParam(a,s,e)){
			return new int[0];
		}
		int min=0;
		int max=0;
		if(s==e){
			min=a[s];
			max=a[s];
		}else if(s+1==e){
			if(a[s]<a[e]){
				min=a[s];
				max=a[e];
			}else{
				max=a[s];
				min=a[e];
			}
		}else{
			int mid=s+(e-s)/2;
			int[] resultA=minMax2(a,s,mid);
			int[] resultB=minMax2(a,mid+1,e);
			min=resultA[0]<resultB[0]?resultA[0]:resultB[0];
			max=resultA[1]>resultB[1]?resultA[1]:resultB[1];
		}
		return new int[]{min,max};
	}

	private static boolean isValidParam(int[] a,int s,int e){
		if(a==null||a.length==0){
			return false;
		}
		int len=a.length;
		if(!(s>=0&&s<len&&e>=0&&e<len)){
			return false;
		}
		return true;
	}
	
}

你可能感兴趣的:(编程之美)