stl的sort函式與二分查詢

2022-07-07 11:54:17 字數 3502 閱讀 1284

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

結構名

} ;

對結構體排序

struct

student ;

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