分治算法(1)-》数组中的最小值最大值
分治算法(一)--》数组中的最小值最大值
问题:《编程之美》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; } }