以前遇到二分的題目都是手動實現二分,不得不說錯誤比較多,關於返回值,關於區間的左閉右開等很容易出錯,最近做題發現直接使用stl中的二分函式方便快捷還不會出錯,不過對於沒有接觸過的同學,二分函式確實是乙個頭疼的部分,自己查的內容又有點亂,找不到具體的使用方法,有必要自己總結乙份完整的以後備用。
#includea.binary_search:查詢某個元素是否出現。
a.函式模板:binary_search(arr,arr+size , indx)
c.函式功能: 在陣列中以二分法檢索的方式查詢,若在陣列(要求陣列元素非遞減)中查詢到indx元素則真,若查詢不到則返回值為假。
2.lower_bound:查詢第乙個大於或等於某個元素的位置。
a.函式模板:lower_bound(arr,arr+size , indx):
b.引數說明:
arr: 陣列首位址
size:陣列元素個數
indx:需要查詢的值
c.函式功能: 函式lower_bound()在first和last中的前閉後開區間進行二分查詢,返回大於或等於val的第乙個元素位置(注意是位址)。如果所有元素都小於val,則返回last的位置
d.舉例如下:
乙個陣列number序列為:4,10,11,30,69,70,96,100.設要插入數字3,9,111.pos為要插入的位置的下標,則
/*注意因為返回值是乙個指標,所以減去陣列的指標就是int變數了*/
pos = lower_bound( number, number + 8, 3) - number,pos = 0.即number陣列的下標為0的位置。
pos = lower_bound( number, number + 8, 9) - number, pos = 1,即number陣列的下標為1的位置(即10所在的位置)。
pos = lower_bound( number, number + 8, 111) - number, pos = 8,即number陣列的下標為8的位置(但下標上限為7,所以返回最後乙個元素的下乙個元素)。
e.注意:函式lower_bound()在first和last中的前閉後開區間進行二分查詢,返回大於或等於val的第乙個元素位置。如果所有元素都小於val,則返回last的位置,且last的位置是越界的!
返回查詢元素的第乙個可安插位置,也就是「元素值》=查詢值」的第乙個元素的位置
3.upper_bound:查詢第乙個大於某個元素的位置。
a.函式模板:upper_bound(arr,arr+size , indx):
b.引數說明:
arr: 陣列首位址
size:陣列元素個數
indx:需要查詢的值
c.函式功能:函式upper_bound()返回的在前閉後開區間查詢的關鍵字的上界,返回大於val的第乙個元素位置
例如:乙個陣列number序列1,2,2,4.upper_bound(2)後,返回的位置是3(下標)也就是4所在的位置,同樣,如果插入元素大於陣列中全部元素,返回的是last。(注意:陣列下標越界)
返回查詢元素的最後乙個可安插位置,也就是「元素值》查詢值」的第乙個元素的位置 。
1 #include2 #include3 using namespace std;4 int main()
5 ;7 int b=binary_search(a,a+9,4);//查詢成功,返回1
8 cout<
**自:
二分查詢 Binary Search
打算重返c c 陣營,所以準備從演算法開始溫習,今天我們談到的是一種效率較高的查詢方法 二分查詢。什麼是二分查詢 二分查詢又稱折半查詢,它是一種效率較高的查詢方法。二分查詢要求 線性表是有序表,即表中結點按關鍵字有序,並且要用向量作為表的儲存結構。二分查詢的基本思想是 1 首先確定該區間的中點位置 ...
二分查詢 BinarySearch
前置條件 乙個有序的序列 假設公升序排列 在序列中查詢指定元素 演算法 首先與序列中間的元素進行比較,如果大於這個元素,就在當前序列的後半部分繼續查詢,如果小於這個元素,就在當前序列的前半部分繼續查詢,直到找到相同的元素,或者所查詢的序列範圍為空為止。int binarysearch vector ...
二分查詢 BinarySearch
二分查詢又稱為折半查詢 首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置記錄將表分成前 後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢...