最簡單的二分查詢

2021-07-30 07:02:00 字數 1338 閱讀 8709

題目

描述:給定乙個排序

的整數陣列(公升序)和乙個要查詢的整數key

查詢到key第一次出現的下標(從0開始),並返回下標,如果key不存在於陣列中,返回-1

樣例:在陣列[1, 2, 3, 3, 4, 5, 10]中二分查詢3,返回2

二分查詢是演算法中非常重要的思想。正常情況下,我們在乙個陣列中查詢乙個數是否存在,該怎麼做呢?當然是與陣列中的元素乙個個對照,那這樣一來,查詢乙個數的時間複雜度就變成了o(n),這也似乎是乙個不可能再優化的演算法了。但是,不能優化的前提是我們並不知道這個陣列的任何規律,或者說這個陣列本身就是沒有規律的。而如果這個陣列是乙個排好序的,那情況就不一樣了。

例如下面這個陣列:[1, 2, 3, 4, 5, 6, 7, 8],我們現在想確定2在不在其中:

(1)找到陣列的中間數(規定在陣列為偶數時,取索引為陣列長度除2的數;陣列長度為奇數時,取索引為不大於陣列長度除2的最大整數,說的有點多,其實舉例就是:陣列為[1, 2]時取1,陣列為[1, 2, 3]時取2)。在這裡,我們取4為中間數

(2)如果中間數》目標,那麼只需要在中間數之前的部分陣列中查詢(排好序的);如果中間數《目標,在中間數以後的陣列中查詢;如果中間數等於目標,直接輸出。此處,我們發現中間數4大於目標,於是,在[1, 2, 3]中查詢

(3)反覆前兩步,直到找到為止

上面這個例子就是二分查詢的基本思想了,實際上是通過「二分」的辦法逐步逼近目標。寫程式時,我們一般使用兩個指標left,right分別指向查詢範圍的第乙個和最後乙個數(這種兩個指標的使用,也可以看做是「二分法」的標配),那麼,像上面這樣沒有重複元素的二分查詢程式就很簡單了

那麼這樣就完成了乙個最簡單的二分查詢了。

最簡單的二分查詢

二分法屬於分治法的一種 對於已經從大到小排好序的陣列,從鍵盤中讀入乙個數,查詢陣列中有沒有和讀入資料相同的,有則輸出 yes 沒有則輸出 no 按照常規想法,迴圈陣列一遍進行比較,當陣列很大時效率低,採用二分,分而治之,講大問題轉化為小問題進行求解 遞迴方式實現 這裡遞迴就是自身呼叫自身的方式 in...

E簡單二分查詢

簡單二分查詢 面對二分查詢,主要是你的思路 第一步 你得把陣列有序的排列,一般選擇從小到大。第二步 把l,r,m確定下來。然後看看你得key 如果,key m,你運氣太好一下子就找到了 如果,key如果,key m,此時你考慮在你的右邊找。從小到大排列為例 第三步 迴圈著,就看你的結束條件了,當然了...

陣列 二分查詢 簡單

描述 給定乙個排序的整數陣列 公升序 和乙個要查詢的整數target,用o logn 的時間查詢到target第一次出現的下標 從0開始 如果target不存在於陣列中,返回 1。在陣列 1,2,3,3,4,5,10 中二分查詢3,返回2。挑戰 如果陣列中的整數個數超過了2 32,你的演算法是否會出...