二分查詢法過程詳解
阿新 • • 發佈:2019-02-03
首先第一要素需要明白,二分查詢法適用於有序陣列,記住,二分查詢之前一定要排序!!!
二分查詢元素
程式碼:
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;
直到兩者重合,然後越位退出迴圈,如果這個過程中出現了下面兩個終止條件則提前結束:
- v[mid]==target,即出現了查詢目標,停止查詢,返回mid為查到的目標下標. 最不理想的情況是直到最後top與base都會指向同一個元素target才返回.
- 如果陣列中不存在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;
}