分治算法(二)--》数组中的第二小值

问题:《编程之美》,page170. 寻找数组中的第二小数

public class FindSecondMin {

	/**
	 * @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};
		try{
			System.out.println("min2 is " + array[merge(array,0,array.length-1)[1]]);
			System.out.println("min2 is " +directCompare(array));
		}catch(Exception e){
			e.printStackTrace();
		}
	}
		/*
		 * 算法设计:
		 
	init:min=min2=array[0];
	
	case: array[i]array[1]){
			min2=array[0];
			min=array[1];
		}else{
			min2=array[1];
			min=array[0];
		}
		for(int i=2; iarray[i]){
				min2=min;
				min=array[i];
			}else { //min<=array[i]
				if(min==min2){  //min=min2<=array[i]
					min2=array[i];
				}else{          //minarray[i]
					if(min2>array[i]&&min!=array[i]){
						min2=array[i];
					}
				}
			}
		}
		return min2;
	}
也如下分析:
已知有minarray[i]){
				min2=min;
				min=array[i];
			}
			
			if((min
	/*
	 * 归并过程
	 * left:(a1,a2),right:(b1,b2)
	 * if(a1b1) min=b1,min2=a1;
	 * if(a1=b1) case: a2=b2  return left;
	 *           case: a2>b2  return a1,b2;
	 *           case: a2array[end])
			{
				mins[0]=end;
				mins[1]=start;
			}else{
				mins[0]=start;
				mins[1]=end;
			}
			return mins;
		}
		if(start==end){  
            mins[0]=mins[1]=start;  
            return mins;  
        }else{
			int[] left=merge(array,start,(start+end)/2);
			int[] right=merge(array,(start+end)/2+1,end);
			
			if(array[left[1]]<=array[right[0]]&& array[left[0]]!=array[left[1]])  return left;
			if(array[right[1]]<=array[left[0]]&& array[right[0]]!=array[right[1]])  return right;
			if( array[left[0]]
 

 

 

 

你可能感兴趣的:(algorithms)