1.要使用標頭檔案#include和using namespace std;
2.對基本型別陣列排序
.sort(陣列名+n1,陣列名+n2)對下標範圍[n1,n2)的元素從小到大排序,下標為n2的元素不在排序區間內
sort(陣列名+n1,陣列名+n2,greater)t為陣列的型別int double 從大到小排序
3。用自定義的排序規則,對任何型別t的陣列排序
sort(陣列名+n1,陣列名+n2,排序規則結構名())
排序規則結構的定義方式
struct結構名
} ;
對結構體排序
structstudent ;
struct stdentrule1
};struct studentrule2//
從大到小
} ;
sizeof(a)/sizeof(int) 可以求int型別陣列的長度
1. 在從小到大排好序的基本型別陣列上進行二分查詢
binary_search(陣列名+n1,陣列名+n2,值);
查詢區間為下標範圍為[n1,n2)的元素,下標為n2的元素不在查詢區間,內在該區間內查詢在該區間內等於值(「等於」的含義:a等於b<=>a必須在b前面 和 b必須在a前面都不成立;不是==)的元素,返回值為true(找到)或false(沒找到)
2. 在用自定義排序規則排好序、元素為任意的t型別的陣列中進行二分查詢
binary_search(陣列名+n1,陣列名+n2,值,排序規則結構名());
查詢區間為下標範圍為[n1,n2)的元素,下標為n2的元素不在查詢區間,內在該區間內查詢在該區間內等於值(「等於」的含義:a等於b<=>a必須在b前面 和 b必須在a前面都不成立;不是==)的元素,返回值為true(找到)或false(沒找到)
查詢的排序規則必須和排序時的規則一樣 否則無意義
#include#include#include
using
namespace
std;
struct
rule
};void print(int a,int
size)
cout
<}int
main()
; sort(a,a+6
); print(a,
6);
cout
<< "
result:
"<< binary_search(a,a+6,12)
<< "
result:
"<< binary_search(a,a+6,77)
,rule());
print(a,6);
cout
<< "
result:
"<< binary_search(a,a+6,7)
<< "
result:
"<< binary_search(a,a+6,8,rule())
}
output
3,7,12,21,45,98,
result:1
result:0
21,12,3,45,7,98,
result:0 //查詢的排序規則和排序時的規則不一樣 無意義
result:1 // 由於等於的含義不是==,98和8的排序規則滿足a必須在b前面 和 b必須在a前面都不成立,所以輸出1
1.在對元素型別為t的從小到大排好序的基本型別的陣列中進行查詢
t * lower_bound(陣列名+n1,陣列名+n2,值);
返回乙個 指標t * p;
*p是查詢區間裡下標最小的,大於等於值的元素。若找不到,指向下標為n2的元素
2.在元素為任意型別,按自定義排序規則排好序的陣列中進行查詢
t * lower_bound(陣列名+n1,陣列名+n2,值,排序規則結構名());
返回乙個 指標t * p;
*p是查詢區間裡下標最小的,按自定義排序規則,可以排在值後面的元素(大於等於)。若找不到,指向下標為n2的元素
1.在對元素型別為t的從小到大排好序的基本型別的陣列中進行查詢
t * upper_bound(陣列名+n1,陣列名+n2,值);
返回乙個 指標t * p;
*p是查詢區間裡下標最小的,大於值的元素。若找不到,指向下標為n2的元素
2.在元素為任意的t型別,按自定義排序規則排好序的陣列中進行查詢
t * upper_bound(陣列名+n1,陣列名+n2,值,排序規則結構名());
返回乙個 指標t * p;
*p是查詢區間裡下標最小的,按自定義排序規則,必須排在值後面的元素。若找不到,指向下標為n2的元素
#include#include#include
using
namespace
std;
struct
rule
};void print(int a,int
size)
cout
<}int
main()
; sort(a,a+7
); print(a,
7);
int *p = lower_bound(a,a+7,5
); cout
<< *p << ","
<< p-a
); cout
<< *p
<< *upper_bound(a,a+7,13)
,rule());
print(a,7);
cout
<< * lower_bound(a,a+7,16,rule())
<< lower_bound(a,a+7,25,rule()) - a
<< upper_bound(a,a+7,18,rule()) - a
) cout
<< *upper_bound(a,a+7,5,rule())
<< *upper_bound(a,a+7,4,rule())
}
output
3,5,5,7,12,21,98,
5,17
2121,12,3,5,5,7,98,73
7not found 75
二分搜尋與STL二分查詢
用法 搜尋非遞減數列中是否包含某個元素 當資料量比較大的時候,二分比線性搜尋高效得多。流程 查詢36 實現 物件是非遞減序列,如果當資料無序時,需要預先進行一次排序。int binarysearch int a,int key,int n n為陣列長度 rerurn 0 陣列a中不存在key 複雜度...
stl 二分查詢
在stl中對二分查詢進行了封裝,有兩種 upper bound,lower bound。例如 pos lower bound a,a n,value 查詢value值在長度為n的陣列a中的位置 關於返回值,函式lower bound 在first和last中的前閉後開區間進行二分查詢,返回大於或等於...
STL 二分查詢
實現原始碼 1.在乙個遞增的陣列 或vector 中查詢元素屬於 s e 的下標 2.查詢遞增陣列中元素是否存在 使用binary search 注 對於結構體,要麼過載小於符號 bool operator 要麼定義有小於符號含義的cmp函式。3.應用在遞減序列中 include include i...