二分法查找(Binary Search)

二分查找是在有序數組中查找一個元素的算法,通過比較目標元素與數組中間元素來查找,如果目標值是中間元素則將返回中間元素位置。如果目標元素較小,則繼續查找小於中間元素部分,如果目標元素較大,則繼續查找大於中間元素部分。直到查找成功並返回其位置,或查到失敗返回。

例在數組 2,5,7,8,10,15,18,20,22,25,28中查找18,如下圖所示:
這裏寫圖片描述
C語言實現

函數原型:
int binary_search(int *array, int imin, int imax, int key)

/**
 * return the index of key.
 * return -1 when failed.
 */
int binary_search(int *array, int imin, int imax, int key)
{
    int imid;

    if(array == NULL || imin > imax) {
        return -1; 
    }

    while(imin <= imax) {
        imid = imin + (imax - imin) / 2;  //avoid integer overflow
        if(array[imid] == key) {
            return imid;
        } else if(array[imid] > key) {
            imax = imid - 1; 
        } else {
            imin = imid + 1;
        }
    }

    return -1;
}

需要注意:
中間元素的查找方法不能爲imid = ( imin + imax ) / 2,這樣可能會造成整數溢出,因此應改爲imid = imin + (imax – imin) / 2。
整數溢出:兩個大整數相加其結果超過寄存器能存儲的最大值,結果不可知。

圖解說明:
array: 2 5 7 8 10 15 18 20 22 25 28
length:11
key: 18
imax = length - 1 = 10
imin = 0

步驟1:
imid = ( imin + imax ) / 2 = (0 + 10) / 2 = 5
這裏寫圖片描述

步驟2:
imid = ( imin + imax ) / 2 = (6 + 10) / 2 = 8 imax = imid -1 = 7
這裏寫圖片描述

步驟3:
imid = ( imin + imax ) / 2 = (6 + 7) / 2 = 6 find 18: index is 6
這裏寫圖片描述

原碼下載地址:
https://github.com/zsirGitHub/algorithms

發佈了37 篇原創文章 · 獲贊 24 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章