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

问题:《编程之美》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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值