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; } }