1. 程式人生 > >面試整理(一):二分法查詢

面試整理(一):二分法查詢

        最近的這段時間在面試的過程中遇到了二分法查詢相關的面試題,由於對下標和陣列大小的不確定,容易導致做錯,今天來分享一下二分法查詢的相關內容。

        首先,說明一下二分法是怎樣的:給定的陣列是有序的,給定一個key值,每次查詢最中間的值,如果相等,就返回對應的下標;如果key大於最中間的值,則在陣列的右半邊繼續查詢;如果小於,則在陣列的左半邊查詢。那麼最終存在兩種結果:一種是找到了並返回對應的下標,第二種就是沒有找到,返回-1。

下面舉例說明:

存在一個數組arr[10],假設arr[10]={3,6,7,9,15,20,26,33,56,63},定義兩個邊界的下標low和high,以及中間下標mid,

int low=0,high=10-1,mid=(low+high)/2,在對每一步進行比較的時候,low<=high,如果要找key為56的值對應的下標,那麼第一次我們先找到中間下標mid=4。因為arr[4]=15,比當前的key值要小,則按照要求在陣列的右半部分查詢,讓low=mid+1,high值不變。接下來,我們繼續找到右半部分的中間下標mid = (5+9)/2=7,arr[7]=33,比當前的key值還小,那麼繼續向右半邊查詢,且low=mid+1,high值繼續不變。接下來,找到中間下標mid=(8+9)/2=8。這個時候arr[8]==key==56,OK,找到目標值,停止查詢,返回下標mid。

        通過上面例子可以看出,在進行指定key查詢的次數總共3次,通過根據中間值和目標key進行比較來判定目標key的位置。接下來給出相關處理程式碼:

/**
 *二分法查詢
 *@author lyr
 *@param 給定陣列
 *@param 要查詢的key值
 *@return 返回key值在陣列中對應的下標,沒有則返回-1
 */
public int binarysearch(int arr[],int key){
    int low = 0,high=arr.length-1;
    int mid=0;
    while(low<=high){
        mid=(low+high)/2;
        if(arr[mid]==key){
            return mid;
        }
        if(arr[mid]<key){
            low=mid+1;    
        }else{
            high=mid-1;
        }
    }
    return -1;
}