二分查詢區間總結

2021-08-22 13:31:29 字數 1007 閱讀 2665

筆者本以為二分查詢非常簡單,掌握一種會用不就差不多了,並不知道區間還分那麼多種,現在總結一下。

比較一下其中的不同之處。(為了更詳細乙個**)

閉區間 [l,r]:

int binary_search(int a,int size,int p)

else

}}

左閉右開:

[l,r)

int binary_search(int a,int size,int p)

else

}}

左開右開:

(l ,r)

int binary_search(int a,int size,int p)

else

}}

下面再給出另一種典型的錯誤的二分查詢演算法,當查詢的元素不在序列內時,它可能造成程式的死迴圈.

int search(int array, int n, int v)

else if (array[middle] < v)

else

}return -1;

}

為什麼會造成死迴圈?

從迴圈條件來看,這個演算法的操作區間是左閉右閉區間的,因此當array[middle] > v時,v如果存在的話應該在[left, middle- 1]中,因此此時right應該是middle - 1,而不是middle;類似的,當array[middle] < v時,下一次操作的區間應該是[middle + 1, right]中.而當元素不存在這個序列中時,演算法在乙個錯誤的區間中迴圈,但是又不能終止迴圈,於是就造成了死迴圈.

因此,要將二分查詢演算法寫對,其實很多人都大概知道思想,具體到編碼的時候,就會被這些看似微小的地方搞糊塗.因此,需要注意這一點:

演算法所操作的區間,是左閉右開區間,還是左閉右閉區間,這個區間,需要在迴圈初始化,迴圈體是否終止的判斷中,以及每次修改left,right區間值這三個地方保持一致,否則就可能出錯.

二分查詢閉區間(l r)類總結

最近做題遇到二分查詢,對於區間的取值以及最後的結果模稜兩可。對於 l r 這種閉區間的。取值的範圍是 left,right 一定要保證每次迴圈結束後left 1或者right 1,結束的狀態left right,left在右邊,right在左邊,目標值下標確定是left。本題相當於乙個陣列,左邊都是...

二分查詢總結

今天上csdn,發現一篇關於二分查詢演算法的文章被置頂,回帖也相當熱烈。我覺得演算法總重要的還是要了解思想,至於程式設計技巧則是其次。二分查詢在計算中演算法中的重要性不言而喻,許多變形的演算法都是基於此演變的,比如二分查詢樹等。所以此演算法程式我也打算總結一下。當然經典的演算法討論莫過於jon be...

二分查詢總結

我們假設乙個最簡單的環境,對於數x,按要求詢問它在乙個陣列a 假設從小到大 裡的位置,陣列個數為n。1.查詢最後乙個小於x的數的位置 常見的一種要求。返回小於x的其中的最右邊乙個數的下標。int half int x return r 2.查詢最後乙個小於或等於x的數的位置 返回小於或等於x的其中的...