你真的會二分查詢嗎

2022-05-06 15:00:12 字數 989 閱讀 8679

二分查詢經常寫掛,最常寫掛的就是陷入乙個死迴圈,如何避免呢?

網上有很多版本的二分**。迴圈條件有:l < r的,有l+1 < r的,有l <= r的。做個總結吧。

一、首先是二分查詢乙個值,找到返回其下標,否則返回-1。

//

在a[l] ~ a[r]中查詢s

int binary_search(int l, int r, int

s)

return -1

;}

二、查詢邊界值

有序陣列中找到「正好大於(小於)目標數」的那個數。

如果找不到怎麼辦呢?要返回什麼值?

我們這裡規定,如果找大於(等於)某個值的數找不到,返回最後乙個值的下乙個座標;

//

a[l] ~ a[r-1]中查詢,如果不存在,則返回座標r

int binary_search(int l, int r, int

s)

return

l;}

如果找小於(等於)某個值的數找不到,返回第乙個值的前乙個座標。

//

a[l+1] ~ a[r]中查詢,如果不存在,則返回座標l

int binary_search(int l, int r, int

s)

return

l;}

總結一下,[l, r]就是所有可能的返回情況。還有就是注意m的取值,用+1調節偏左還是偏右,避免死迴圈。

為什麼不用(l+r)/2呢....因為l+r是負數的時候他偏左或偏右和正數的時候就不一樣了;還有一點就是防l+r溢位。

最後附乙份整數三分的**:

在[l, r]裡三分,

取m1 = (2*l+r)/3, m2 = (l+2*r+2)/3

如果f(m1)更優就r = m2-1,

否則l = m1+1

不會死迴圈也無需特判

你真的會二分查詢嗎?

看到這個標題無論你是處於怎樣的心理進來看了,我覺得都是值得的。因為這個問題太簡單,任何乙個開始接觸 真正 演算法基本都是從二分查詢開始的。至於二分查詢都不知道是什麼的可以先去找別的資料看下,再來看這篇文章。既然很簡單,那麼我們開始一起寫乙個吧,要求是對num 不減序列在區間 0,7 進行查詢,當然我...

你真的會二分查詢嗎?

引用請註明出處 看到這個標題無論你是處於怎樣的心理進來看了,我覺得都是值得的。因為這個問題太簡單,任何乙個開始接觸 真正 演算法基本都是從二分查詢開始的。至於二分查詢都不知道是什麼的可以先去找別的資料看下,再來看這篇文章。既然很簡單,那麼我們開始一起寫乙個吧,要求是對num 不減序列在區間 0,7 ...

你真的會二分查詢嗎?

看到這個標題無論你是處於怎樣的心理進來看了,我覺得都是值得的。因為這個問題太簡單,任何乙個開始接觸 真正 演算法基本都是從二分查詢開始的。至於二分查詢都不知道是什麼的可以先去找別的資料看下,再來看這篇文章。既然很簡單,那麼我們開始一起寫乙個吧,要求是對num 不減序列在區間 0,7 進行查詢,當然我...