算法思想:如果数组中只有两个元素则较小的为最小值,较大的为最大值;
否则根据下标将数组折半,比较左半部分的最小最大值和右半部分的最小最大值,较小的为最小值,较大的为最大值,此过程递归进行。
Java实现:
/**
* 分治法求数组的最小最大值
* @author cht
*
*/
public class AlgoTest {
public static void main(String[] args) {
new AlgoTest().test();
}
public void test(){
int[] a=new int[]{1,10,2,19,36,0,100};
MinMax mm=getMinMax(a,0,a.length-1);
System.out.println("最小值:"+mm.getMin());
System.out.println("最大值:"+mm.getMax());
}
public MinMax getMinMax(int[] a,int begin,int end){
if(end-begin<=1){
if(a[begin]>a[end]){
return new MinMax(a[end],a[begin]);
}else{
return new MinMax(a[begin],a[end]);
}
}else{
int mid=(begin+end)/2;
MinMax left=getMinMax(a,begin,mid);
MinMax right=getMinMax(a,mid,end);
int min=0,max=0;
min=left.getMin()>right.getMin()?right.getMin():left.getMin();
max=left.getMax()>right.getMax()?left.getMax():right.getMax();
return new MinMax(min,max);
}
}
class MinMax{
public MinMax(int min,int max){
mMin=min;
mMax=max;
}
public int getMin(){
return mMin;
}
public void setMin(int value){
mMin=value;
}
public int getMax(){
return mMax;
}
public void setMax(int value){
mMax=value;
}
private int mMin;
private int mMax;
}
}