现在的位置: 首页 > 综合 > 正文

给定两个有序数组求他们的中位数

2013年09月04日 ⁄ 综合 ⁄ 共 1593字 ⁄ 字号 评论关闭
package su.interview;

import utils.com.ArrayLister;

/**
 * 给定两个有序数组,求中位数.
 * @author Toy
 *
 */
public class MiddleNum_01 {

	/**
	 * 二者先合并成有序数组
	 * @param a
	 * @param b
	 * @return 
	 */
	public void midnum_01(int[] a,int[] b){
		System.out.println("method 1");
		int alen=a.length;
		int blen=b.length;
		int[] c=new int[alen+blen];
		int k=0;
		int i=0;
		int j=0;
		
		while(i<alen&&j<blen){
			if(a[i]<=b[j]){
				c[k++]=a[i];
				i++;
			}else{
				c[k++]=b[j];
				j++;
			}
		}
		while(i<alen){
			c[k++]=a[i++];
		}
		while(j<blen){
			c[k++]=b[j++];
		}
		
		ArrayLister.showArr(c);
		if(k%2!=0){
			System.out.println("mid num is: "+c[k/2]);
		}else{
			System.out.println("mid num are: "+c[k/2-1]+" "+c[k/2]);
		}
	}
	/**
	 * 直接先根据长度确定中位数的顺序
	 * @param a
	 * @param b
	 */
	public void midnum_02(int[] a,int[] b){
		System.out.println("method 2");
		int alen=a.length;
		int blen=b.length;
		int[] mids=new int[]{0,0};

		int pos=(alen+blen)/2;
		int temp=0;
		int i=0;
		int j=0;
		int k=0;//为即将插入的位置.
		
		while(i<alen&&j<blen){
			if(a[i]<=b[j]){
				temp=a[i];
				i++;
			}else{
				temp=b[j];
				j++;
			}
			k++;
			int state = checkK(pos,k-1,temp,mids);
			if(state==2){
				break;
			}

		}
		while(i<alen){
			temp=a[i];
			i++;
			k++;
			int state = checkK(pos,k-1,temp,mids);
			if(state==2){
				break;
			}

		}
		while(j<blen){
			temp=b[j];
			j++;
			k++;
			int state = checkK(pos,k-1,temp,mids);
			if(state==2){
				break;
			}
		}
		
		if((alen+blen)%2==0){
			System.out.println("mid num are: "+mids[0]+" "+mids[1]);	
		}else{
			System.out.println("mid num is: "+mids[1]);	
		}

	}
	private int checkK(int pos, int k, int temp, int[] mids) {
//		System.out.println(pos+" "+k+" "+temp);

		if(k==pos-1){
			mids[0]=temp;
			return 1;
		}
		if(k==pos){
			mids[1]=temp;
			return 2;
		}
		if(mids[0]>0&&mids[1]>0){
			return 2;
		}

		return 0;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int[] a=new int[]{1,2,3,4,5,12,13};
		int[] b=new int[]{6,7,8,9,10,29,30};
		
		MiddleNum_01 m=new MiddleNum_01();
		m.midnum_01(a, b);
		m.midnum_02(a, b);
	}
}

抱歉!评论已关闭.