1. 程式人生 > >二分查詢演算法的兩種實現方式

二分查詢演算法的兩種實現方式

二分查詢的條件是對一組有序陣列的查詢,這一點很容易忘記,在使用二分查詢的時候先要對陣列進行排序。

先說一下二分查詢的思路:一個有序陣列,想要查詢一個數字key的下標,首先算出中間下標mid,利用mid把這個陣列分為兩半,前一半從下標0到mid-1,後一半從mid+1到陣列最後一個元素(下標是陣列長度減一)。把這個查詢的元素key和陣列下標為mid的元素進行比較,也就是和中間那個元素進行比較,如果比這個元素的小那麼把查詢範圍縮小到原陣列的前一半(把查詢下標縮短到0到mid-1),如果比中間mid下標元素大那麼範圍就是後半部分(下標為mid+1到陣列長度減一),這樣來回反覆取中間比較最後就會定位到要查詢元素key的下標。

二分查詢有兩種實現方式:

  1. 非遞迴實現
  2. 遞迴實現

在jdk原始碼中Arrays陣列工具類中已經封裝好了二分查詢演算法,不會寫可以看看原始碼,原始碼實現的方式肯定是效率比較高的。比如計算陣列中間下標mid利用移位運算。

非遞迴實現:

/**
	 * @param array 運算元組
	 * @param key 查詢元素
	 * @return 元素下標
	 */
	public static int binSearch(int[] array,int key){
		int start=0;
		int mid;
		int end=array.length-1;
		while(start<=end){
			mid=(end-start)/2+start;
			if(key<array[mid]){
				end=mid-1;
			}
			else if(key>array[mid]){
				start=mid+1;
			}else{
				return mid;
			}
		}
		return -1;
	}

遞迴實現:

/**
	 * @param array 運算元組
	 * @param key 查詢元素
	 * @param start 開始下標
	 * @param end 結束下標
	 * @return 元素下標
	 */
	public static int binSearch1(int[] array,int key,int start,int end){
		int mid=(end-start)/2+start;
		if(key==array[mid]){
			return mid;
		}
		else if(start>=end){
			return -1;
		}
		else if(key>array[mid]){
			return binSearch1(array,key,mid+1,end);
		}
		else if(key<array[mid]){
			return binSearch1(array,key,start,mid-1);
		}
		return -1;
	}