1. 程式人生 > >二分查詢法過程詳解

二分查詢法過程詳解

首先第一要素需要明白,二分查詢法適用於有序陣列,記住,二分查詢之前一定要排序!!!

二分查詢元素

程式碼:

int base=0;
int top=size-1;
while(base<=top){
    mid=(top+base)/2;
        if(v[mid]==target) break; //mid為所求下標
        if(v[mid]<target) base=mid+1;
        if(v[mid]>target) top=mid-1;
}

二分查詢過程: 我們可以把整個查詢過程看成是不停地聚攏top和base,執行下面兩種操作

if(v[mid]<target) base=mid+1;
if(v[mid]>target) top=mid-1;

直到兩者重合,然後越位退出迴圈,如果這個過程中出現了下面兩個終止條件則提前結束:

  1. v[mid]==target,即出現了查詢目標,停止查詢,返回mid為查到的目標下標. 最不理想的情況是直到最後top與base都會指向同一個元素target才返回.
  2. 如果陣列中不存在targret,那麼在最後一次迴圈體裡面應該是這樣的情形:top與base同時指向第一個大於target的元素,由於其大於target, 執行top=mid-1,那麼結果就是base指向大於target的第一個數,top指向小3於target的最後一個數,然後退出迴圈.

利用二分查詢定界

即給定一個有序陣列,找到元素i,使得i之前的元素(包括i)都不大於target,i之後的元素都大於target.
可以分兩種情況來考慮

1.陣列中不存在target. 則根據第一部分的討論,最後top和base同時指向第一個大於target的元素,然後進行最後一次小標變換,top=mid-1前移一個元素指向最後一個小於target的元素,base指向第一個大於target的元素.則top為所求

while(base<=top){
    mid=(top+base)/2;
    if(v[mid]<target) base=mid+1;
    if
(v[mid]>target) top=mid-1; }

2.陣列中存在target.我們只要把等於target的元素和小於target的元素歸為一類,則最後結果仍然為top與base指向第一個大於target的元素,然後進行最後一次下標變換,top=mid-1前移一個元素,指向的是最後一個等於target的元素,base指向第一個大於target的元素.

while(base<=top){
    mid=(top+base)/2;
    if(v[mid]<=target) base=mid+1;
    if(v[mid]>target) top=mid-1;
}

綜合上面兩種情況,最後的程式碼為

while(base<=top){
    mid=(top+base)/2;
    if(v[mid]<=target) base=mid+1;
    if(v[mid]>target) top=mid-1;
}