二分查詢是針對有序序列來說的,在有序序列中使用二分查詢能大大提高查詢效率。
① 首先確定整個查詢區間的中間位置 mid
② 用待查關鍵字key值與中間位置的關鍵字值進行比較;
若相等,則查詢成功
若大於,則在後(右)半個區域繼續進行折半查詢
若小於,則在前(左)半個區域繼續進行折半查詢
③ 對確定的縮小區域再按折半公式,重複上述步驟。
(1)簡單的寫法
但這種寫法有個缺點:mid可能會溢位。mid = (start + end) / 2
我們可以舉乙個簡單的例子來證明這一事實。
比如,當start = 1000 ,
end = int_max。
int_max
是int
資料型別可以儲存的上限。這時start + end的和就溢位了。
(2)保險的寫法
mid = start + (end - start) / 2這樣的寫的好處大概有兩個:
第一:不會產生溢位
第二:從通用性考慮,適用於對指標或者迭代器的操作。如果start和end同時是指標或者同時是迭代器時無法編譯通過,因為倆指標或者倆迭代器運算不支援相加運算,只支援相減運算。
為什麼指標和迭代器運算不支援相加運算,只支援相減運算?
我發現網上很少提及這個問題的原因。本人認為原因是這樣的:兩個迭代器相加,或者兩個指標相加後所表示的位置對於vector容器就越界了,失去的意義。但是相減就可以,位置還在容器之中。
(3)(2)的另一種寫法
mid = start + ((end - start) >> 1)這種寫法和(2)一樣。
「>>」:表示向右移。value >> num:即value的二進位制數整體向右移num位,表示在十進位製上就是value除以2的num次方,value >> 1就是value 除以2。
「<<」:表示左移。value << num,就是指value的二進位制形式整體向左移動num位,表示在十進位製上就是value乘以2的num次方,value << 1就是value乘以2。
故(end - start) >> 1,即為(end - start) / 2。
非遞迴寫法:
/**
*author: young fan
*date: 2019.04.26
*ide: visual studio 2017
*description:
*/#include using namespace std;
int binarysearch(int numbers, int length, int target)
return -1;
}int main()
; //有序的
int length = sizeof(numbers) / sizeof(int); //n得7
cout << "length = " << length << endl;
int a = binarysearch(numbers, length, 7); //返回資料陣列的下標
cout << a << endl;
return 0;
}
遞迴寫法:
int binarysearch(int a, int start, int end, int target)
二分查詢演算法(遞迴 非遞迴)
二分查詢 binary search 先來個比較官方的解釋 二分搜尋 英語 binary search 也稱折半搜尋 英語 half interval search 對數搜尋 英語 logarithmic search 是一種在有序陣列中查詢某一特定元素的搜尋演算法。搜尋過程從陣列的中間元素開始,如...
二分查詢(遞迴 非遞迴)
二分查詢是一種查詢效率非常高的查詢演算法。又稱折半查詢。起初在資料結構中學習遞迴時實現二分查詢,實際上不用遞迴也可以實現,畢竟遞迴是需要開闢額外的空間的來輔助查詢。本文就介紹兩種方法 其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。使用條件 查詢序...
二分查詢演算法 遞迴 非遞迴實現
package sorttest 名稱 binarysearch 功能 實現了折半查詢 二分查詢 的遞迴和非遞迴演算法.說明 1 要求所查詢的陣列已有序,並且其中元素已實現comparable介面,如integer string等.2 非遞迴查詢使用search 遞迴查詢使用searchrecurs...