1. 程式人生 > >利用二分法查詢一個數字在陣列中的位置

利用二分法查詢一個數字在陣列中的位置

問題:有一個升序排列無重複數字的資料,以及一個數字,利用二分法查詢數字在陣列中的位置,找到則返回其位置號,沒找到返回-1.

解答:

通過兩種方式實現:第一種方式為遞迴實現,需要傳遞陣列的頭和尾的位置。

public class MidFind {
	
	/**
	 * 
	 * @param arr
	 * @param key
	 * @param startNum 陣列位置號,為陣列下標+1
	 * @param endNum 陣列位置號,為陣列下標+1
	 * @return
	 */
	public static int getLocation(int[] arr,int key,int startNum,int endNum) {
		if (arr==null) return -1;
		int middleNum=(startNum+endNum)/2;
		System.out.println("中間值:"+middleNum);
		if (startNum<endNum) {
			if (key==arr[middleNum]) {
				return middleNum+1;
			} else if (key<arr[middleNum]) {
				return getLocation(arr,key,startNum,middleNum);
			} else {
				return getLocation(arr,key,middleNum,endNum);
			}
		} else if (startNum==endNum) {
			return startNum;
		} else {
			return -1;
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr={1,3,4,5,6,7,11,46,255,743,888};
		int temp=getLocation(arr,11,1,11);
		System.out.println(temp);
	}

}
第二種實現方式為非遞迴實現,則利用迴圈:
public class MidFind2 {

	public static int getLocation(int[] arr,int key) {
		if (arr==null) return -1;
		int middleNum=arr.length/2;
		if (key==arr[middleNum]) {
			return middleNum+1;
		}
		int startNum=0; //陣列下標
		int endNum=arr.length-1; //陣列下標
		while (startNum<=endNum) {
			middleNum=(startNum+endNum)/2;
			if (key<arr[middleNum]) {
				endNum=middleNum;
			} else if (key>arr[middleNum]) {
				startNum=middleNum;
			} else {
				return middleNum+1;
			}
		}
		return -1;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr={1,3,4,5,6,7,11,46,255,743,888};
		int temp=getLocation(arr,5);
		System.out.println(temp);
	}

}