分治算法(一)--》数组中的最小值最大值

问题:《编程之美》page166. 寻找数组中的最大值,最小值。

 

 

 

public class MinMax {

	/**
	 * @author:lilywangcn
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array=new int[]{12,34,54,43,23,11,10,9,9,10,9,10};
		int[] result=find(array);
		System.out.println("min is " + result[0]+", max is " + result[1]);
		
		result=merge(array,0,array.length-1);
		System.out.println("min is " + array[result[0]]+", max is " + array[result[1]]);
	}

/*
算法设计:直接比较,需要比较2n次
*/
	public static int[] find(int[] array){
		int min=array[0];
		int max=array[1];
		
		for(int i=1;i<array.length;i++){
			if(min>array[i]) min=array[i];
			if(max<array[i]) max=array[i];
		}
		
		int[] result=new int[2];
		result[0]=min;
		result[1]=max;
		return result;
	}



/*
算法设计:分治方法比较。类似比赛中的淘汰赛,最后胜出者一定是最好的。两两相比,取其小(大)者,再互相比较,z比较次数:1.5n-2。
*/
	public static int[] merge(int[] array, int start, int end){
		int[] result=new int[2];
		if(start==end){
			result[0]=result[1]=start;
			return result;
		}else{
			int[] left=merge(array,start,(start+end)/2);
			int[] right=merge(array,(start+end)/2+1,end);
			if(array[left[0]]<array[right[0]]) 
				result[0]=left[0];
			else
				result[0]=right[0];
			
			if(array[left[1]]<array[right[1]]) 
				result[1]=right[1];
			else
				result[1]=left[1];
		}
		
		return result;
	}
}

你可能感兴趣的:(编程,算法)