最近做了幾家筆試題,基本在選擇題都考到二分查找法的次數。由於對下標和數組大小的不確定,做錯了好幾個,今天,希望通過圖解來說明一下二分查找的比較次數。
二分查找:給定數組是有序的,給定一個key值。每次查找最中間的值,如果相等,就返回對應下標,如果key大於最中間的值,則在數組的右半邊繼續查找,如果小於,則在數組左半邊查找,。最終有兩種結果,一種是找到並返回下標,第二種是沒找到。
下面給個例子說明一下:
有一個數組arr[10];
0 1 2 3 4 5 6 7 8 9
3 |
6 |
7 |
10 |
11 |
16 |
20 |
33 |
56 |
89 |
定義兩個邊界下標low和high,定義中間下標mid;
low=0; high=10-1; mid = (low+high)/2;
在進行每一步的比較時,low<=high;
如果我們尋找key為56的值的下標。
第一次我們找到中間下標mid = 4;
0 1 2 3 4 5 6 7 8 9
3 |
6 |
7 |
10 |
11 |
16 |
20 |
33 |
56 |
89 |
arr[4] = 11,比當前key值小,所以我們在右半邊查找,令low = mid + 1;high不變;
我們找到中間下標mid = (5+9)/2 =7;
0 1 2 3 4 5 6 7 8 9
3 |
6 |
7 |
10 |
11 |
16 |
20 |
33 |
56 |
89 |
low mid high
arr[7] = 33,比當前key值小,所以我們在右半邊查找,令low = mid + 1;high不變;
我們找到中間下標mid = (8+9)/2 =8;
0 1 2 3 4 5 6 7 8 9
3 |
6 |
7 |
10 |
11 |
16 |
20 |
33 |
56 |
89 |
low high
mid
此時key == arr[mid] == arr[8];停止查找,返回下標mid;
所以在查找56的時候,比較次數為3次。
下面給出代碼
int search(int arr[],int n,int key)
{
int low = 0,high = n-1;
int mid,count=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;
}