你真的會二分查詢嗎?

2021-07-03 01:50:03 字數 1932 閱讀 8759

引用請註明出處:

看到這個標題無論你是處於怎樣的心理進來看了,我覺得都是值得的。因為這個問題太簡單,任何乙個開始接觸「真正」演算法基本都是從二分查詢開始的。至於二分查詢都不知道是什麼的可以先去找別的資料看下,再來看這篇文章。既然很簡單,那麼我們開始一起寫乙個吧,要求是對num=不減序列在區間[0,7)進行查詢,當然我們得首先保證要查詢的數e滿足:num[0] <= e <= num[0],這個是很容易做到的,為了簡化又不失去代表性,e選取2、3、4這三個數。我們就一起開始寫吧:

首先,很容易的寫下 int bsearch(int begin, int end, int e)

然後,很自然的定義 int mid, left = begin, right = end;

接下來怎麼寫呢?while(left < right)?while(left <= right)?while(mid == left)?while(mid == right)?………………真正乙個寫程式人會想糾結好一會兒,我們就選乙個吧while(left < right)

下面,也很自然,min = (left + right) >> 1; 用位雲算能節省一些時間呢!

現在呢?又是糾結的時候了吧?if(num[mid] > e)?if(num[mid] >= e)?我們也隨便選乙個吧,if(num[mid] > e)

其實,下面你會不斷糾結……right = mid;這是正常人的寫法,但是有時候也會看到別人寫成right = mid - 1;我們也考慮下吧,但是現在我們就直接寫right = mid;

有if了當然也會有else,然後理所當然 left = mid;同樣記住還有乙個選擇left = mid + 1;

不錯,整個while迴圈搞定了,最後就是返回了,寫下return的時候是不是又糾結了?left?right?mid?算了,就寫mid吧,整個程式就寫好了,如下:

int bsearch(int begin, int end, int e)

return mid;

}

補充好整個程式後執行吧!查詢2、3、4的時候都沒有結果出現!!比如查4的時候,單步除錯會發現當mid=4,left=4,right=5,接下來就一直在while裡迴圈,保持不變!問題到底在哪?問題在很多地方,因為我們上面的遇到很多選擇,沒有結果是多個選擇作用的共同的結果,通過修修補補也可以得到想要的結果,其它例子就不舉了,直接說說本文章討論的關鍵吧。我總結的二分無非就4種情況:yes_left、yes_right、no_left、no_right,分別代表:能找到且返回最左邊的數的位置(如查詢4的時候返回位置3)、能找到且返回最右邊的數的位置(如查詢4的時候返回位置4)、不能找到且返回左邊與其接近的數的位置(如查詢3的時候返回位置2)、不能找到且返回右邊與其接近的數的位置(如查詢3的時候返回位置3)。下面是我總結除錯的**:

對於yes_left或者no_right

int bsearch(int begin, int end, int e)

return left;

}

對於yes_right或者no_left

int bsearch(int begin, int end, int e)

return right;

}

不做過多說明,單步除錯自然會發現執行過程,要說明的是,兩個程式都用了right = mid - 1; left = mid +1;用這個的前提是終止條件要是left <= right。要注意的是,有的二分查詢不是只需要四種情況中的一種,而是組合使用,比如查詢乙個數,如果找到則×××不然則×××,如果是yes_left || no_right組合或者yes_right || no_left組合就直接用上面**即可,否則就要綜合用了,加一些判斷等說明,因為用的時候不多,就不給出**了,自己如果遇到可以試著寫寫,當成模板,以後直接用~

現在,是不是覺得二分查詢很容易呢?如果總結過的話……

你真的會二分查詢嗎?

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

你真的會二分查詢嗎?

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

你真的會二分查詢嗎?

二分查詢是一種在有序陣列中查詢某一特定元素的搜尋演算法。搜尋過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜尋過程結束 如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。如果在某一步驟陣列為空,則代表找不到。這種搜尋演算法...