我的主力部落格:
半畝方塘
使用迭代器進行二分搜尋是迭代器運算的乙個經典案例之中的乙個,二分搜尋是指在給定的 有序序列 中查詢某個想要的元素的過程:
舉個樣例,假設所給的有序序列為:
3。 5。 6, 8, 11。 24, 33
第一種情況,所給的有序序列中有我們搜尋的元素。譬如我們要搜尋的元素是 24 ,這個有序序列共同擁有 7 個元素。假設這 7 個元素儲存在陣列中,則它們在陣列中的位置分別為 0, 1, 2 ... 6,二分搜尋的查詢範圍為 0, 1, 2 ... 6。首先找出中間元素的位置 0 + (6 - 0)/2 = 3,則中間元素為 8。而 24 > 8,故所要搜尋的元素在這個有序序列的後半部分,改變所給查詢範圍的起始位置為 3 + 1 = 4,得到新範圍中中間元素的位置為 4 + (6 - 4)/2 = 5,則中間元素為 24。與我們要搜尋的元素的值相等。搜尋完畢;
另外一種情況,所給有序序列中沒有我們要搜尋的元素,譬如我們要搜尋 7, 7 < 8,在這個有序序列的前半部分。所給範圍的終止位置發生改變。終止位置變為 3 - 1 = 2。新範圍的中間元素的位置為 0 + (2 - 0)/2 = 1。中間元素的值為 5。 7 > 5,若所給序列存在元素 7 則應該在這個序列的後半部分,剛才所得新範圍的起始位置應發生改變,起始位置變為 1 + 1 = 2,再次得到的新範圍的中間元素的位置為 2 + (2 - 2)/2 = 2,即中間元素為 6,6 < 7, 可是新範圍的起始位置。中間位置與終止位置同樣,則這個序列中已經沒有能夠搜尋的元素,結束搜尋。
為了幫助理解使用迭代器進行二分搜尋的演算法思想,上面以文字的形式描寫敘述了在陣列中存入有序序列時二分搜尋的詳細實現過程,以下來看看使用迭代器進行二分搜尋的詳細實現**:(如果這個有序序列被儲存在名為 text 的vector
物件中)
auto beg = text.begin(), auto end = text.end(); // 二分搜尋的最初查詢範圍
auto mid = text.begin() + (end - beg)/2; // 中間元素的迭代器
// 當所給序列中有元素尚未檢查而且還沒有找到我們搜尋的值 sought 時執行迴圈
while (mid != end && *mid != sought)
注意差別,陣列中的終止位置確實關聯乙個實際存在的元素,可是迭代器 end 返回的總是序列中最後乙個元素的下乙個位置。即尾後元素,要特別加深理解 while 語句中的**:
mid != end
迭代法二分搜尋
include include include include using namespace std static int x 1 int main else 向後分 mid beg end beg 2 if mid end 如果中分數的位置超過迭代器末尾的下一位置,返回非,此時已經遍歷整個佇列,...
C 筆記之迭代器實現二分搜尋
c primer 當中對二分搜尋是這樣闡述的 使用迭代器完成二分搜尋的例程如下 text必須有序 begin和end表示我們搜尋的範圍 auto begin text.begin auto end text.end auto mid text.begin end begin 2 初始狀態下的中間點 ...
迭代二分查詢二分查詢
在寫這篇文章之前,已經寫過了幾篇關於改迭代二分查詢主題的文章,想要了解的朋友可以去翻一下之前的文章 bentley在他的著作 writing correct programs 中寫道,90 的計算機專家不能在2小時內寫出完整確正的二分搜尋演算法。難怪有人說,二分查詢道理單簡,甚至小學生都能明確。不過...