问题:《编程之美》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;
}
}