先看乙個二分查詢的框架吧
else
if(num[mid]
< target)
else
if(num[mid]
> target)
}return..
.}
接下來以乙個例子來理解二分查詢
#include
#include
intmain()
;int left =0;
int length =
sizeof
(num)
/sizeof
(int);
int right = length;
int target =6;
while
(left <= right)
else
if(num[mid]
< target)
else
if(num[mid]
> target)
}printf
("\n沒找到");
return0;
}
這個例子表示在陣列找乙個數,如果找到了就輸出它的索引,如果沒有找到,那麼就顯示沒找到(也可以用別的方法,這裡是為了展示二分法,所以就用二分查詢來找)
while的括號中是 <=, 因為right = length,即為陣列最後乙個數的索引,為什麼不用<,這兩者就相當於區間,前者是[ left , right ],後者就相當於[ left , right),這個演算法用閉區間,防止出現越界的情況。
在什麼時候會「掃瞄」停止呢?
if
(num[mid]
== target)
這段**代表已經「掃瞄」到了目標的數,就把找到的數的索引輸出
沒有「掃瞄」到時就需要while來控制,while迴圈什麼時候停止呢?當「掃瞄」的區間沒有了的時候即會停止,left <= right的停止條件是left ==right + 1,也就相當於[ right+1 , right ],此時「掃瞄」區間為空,就會跳出迴圈,且會得到正確結果,如果left < right ,停止條件就是left == right ,也就相當於[ right , right ],我們來待入乙個數left = 3,那麼這個區間為[ 3, 3 ],我們會發現此時的「掃瞄」區間不是空,還有乙個3,也就是說已經跳出了while 迴圈,但是我們漏下了索引為3的數,此時就會出現錯誤,如果你很想用left < right, 那麼最後不要忘記判斷num[left] == target。
對於left = mid + 1,right = mid - 1
本演算法的「掃瞄」區間是兩端都閉的,即 [left, right]。那麼當我們發現索引 mid 不是要找的 target 時,就去掃瞄 [left, mid - 1] 或者 [mid + 1, right] , mid 已經搜尋過,應該從搜尋區間中去除。
二分查詢詳細介紹
分類 演算法 search bi程式設計優化 二分查詢演算法基本思想 二分查詢演算法的前置條件是,乙個已經排序好的序列 在本篇文章中為了說明問題的方便,假設這個序列是公升序排列的 這樣在查詢所要查詢的元素時,首先與序列中間的元素進行比較,如果大於這個元素,就在當前序列的後半部分繼續查詢,如果小於這個...
迭代二分查詢二分查詢
在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...
二分查詢演算法的詳細講解
二分演算法是乙個較高效率的查詢演算法,但是二分法中的細節卻經常使人感到懵圈。有一次看到一位大神整理的二分演算法細節分析,個人覺得挺好的,借鑑大神的講解,我也大致整理了一些內容。二分演算法常用情景大致分為三種 尋找乙個數 尋找左側邊界 尋找右側邊界。int binarysearch int nums,...