二分法的查找圖解


最近做了幾家筆試題,基本在選擇題都考到二分查找法的次數。由於對下標和數組大小的不確定,做錯了好幾個,今天,希望通過圖解來說明一下二分查找的比較次數。

二分查找:給定數組是有序的,給定一個key值。每次查找最中間的值,如果相等,就返回對應下標,如果key大於最中間的值,則在數組的右半邊繼續查找,如果小於,則在數組左半邊查找,。最終有兩種結果,一種是找到並返回下標,第二種是沒找到。

下面給個例子說明一下:

有一個數組arr[10];

   0      1      2      3      4       5      6       7      8       9 

3

6

7

10

11

16

20

33

56

89

定義兩個邊界下標lowhigh,定義中間下標mid

low=0 high=10-1; mid = (low+high)/2;

在進行每一步的比較時,low<=high;

如果我們尋找key56的值的下標。

第一次我們找到中間下標mid = 4

    0      1      2      3      4       5      6       7      8       9   

3

6

7

10

11

16

20

33

56

89

  low                                 mid                                          high

arr[4] = 11,比當前key值小,所以我們在右半邊查找,令low = mid + 1high不變;

我們找到中間下標mid = (5+9)/2 =7

    0      1      2      3      4       5      6           8       9                                       

3

6

7

10

11

16

20

33

56

89

                                 low                       mid             high

arr[7] = 33,比當前key值小,所以我們在右半邊查找,令low = mid + 1high不變;

我們找到中間下標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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM