首先書寫二分法**存在下列三個易錯點:
1. 計算mid防止溢位
2. while判斷越界問題
3. left=mid+1,right=mid-1問題
先看第乙個mid取值問題,我們知道integer的取值是有範圍的,一旦超出就會報錯
- integer.max_value表示int資料型別的最大取值數:2 147 483 647
- integer.min_value表示int資料型別的最小取值數:-2 147 483 648
第二個問題while判斷的問題
while(left <= right)的終止條件是 left == right + 1,寫成區間的形式就是 [right + 1, right],或者帶個具體的數字進去 [3, 2],可見這時候搜尋區間為空,因為沒有數字既大於等於 3 又小於等於 2 的吧。所以這時候 while 迴圈終止是正確的,直接返回 -1 即可。
while(left < right)的終止條件是 left == right,寫成區間的形式就是 [right, right],或者帶個具體的數字進去 [2, 2],這時候搜尋區間非空,還有乙個數 2,但此時 while 迴圈終止了。也就是說這區間 [2, 2] 被漏掉了,索引 2 沒有被搜尋,如果這時候直接返回 -1 就可能出現錯誤。
當然,如果你非要用 while(left < right) 也可以,我們已經知道了出錯的原因,就打個補丁好了
原文引用自
第三個問題是left,right問題直接上**
public static void main(string args) ;
//使用二分法查詢4的位置
int left=0;
int right=arr.length-1;
int target=115;
while (left<=right)else if(arr[mid]>target)else if(arr[mid]}
}
上面這段**在執行到12,13兩個位置時,進入死迴圈。left=12,right=13,mid=12無限重複下去,
所以最後寫為上面**樣式。
二分法 總結
1 二分查詢 binarysearch 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。二分查詢要求 線性表是有序表,即表中結點按關鍵字有序,並且要用向量作為表的儲存結構。不妨設有序表是遞增有序的。2 二分查詢的基本思想 二分查詢的基本思想是 設r low,high 是當前的查詢區間 1 首先確定...
關於二分法查詢
今天在 c primer 第五版page101上看見乙個問題 在二分法搜尋中為什麼用的是 mid beg end beg 2 而非 mid beg end 2 從我原先的思維,去兩個數的中間值確實是兩數相加除以二,所以想了好一會兒也沒想明白,無奈之下只好求助google了 1.beg end有溢位風...
關於二分法查詢
與一般的查詢方式相比二分法查詢則顯得高效快速,即只要較少的查詢次數就可以完成快速地搜尋。在進行二分法查詢前需要先對資料進行排序,定義left,right兩個變數,然後在這組資料中找到mid right left right 2,然後將待查詢元素與mid所指元素進行比較,如果相等則返回,如果查詢元素大...