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