二分查詢(詳細)

2021-10-02 03:31:46 字數 1464 閱讀 2533

先看乙個二分查詢的框架吧

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,...