用binary_search进行二分查找

用法一:在从小到大排好序的基本类型数组上进行二分查找

binary_search(数组名+n1,数组名+n2,值);

n1和n2都是int类型的表达式,可以包含变量

如果n1=0,则 + n1可以不写

查找区间为下标范围为[n1,n2)的元素,下标为n2的元素不在查找区间内 在该区间内查找”等于”值”的元素,返回值为true(找到)或false(没找到)

“等于”的含义: a 等于 B <=> a < b和b < a都不成立

用法二:在用自定义排序规则排好序的、元素为任意的T类型的数组中进行二分查找

binary_search(数组名+n1,数组名+n2,值,排序规则结构名());

查找时的排序规则,必须和排序时的规则一致!

binary_search用法实例:

#include
#include
#include
using namespace std;
struct Rule //按个位数从小到大排
{
bool operator()( const int & a1,const int & a2) {
return a1%10 < a2%10;
}
};
void Print(int a[],int size) {
for(int i = 0;i < size;++i) {
cout << a[i] << “,” ;
}
cout << endl;
}
int main() {
int a[] = { 12,45,3,98,21,7};
sort(a,a+6);
Print(a,6);
cout <<”result:”<< binary_search(a,a+6,12) << endl;
cout <<”result:”<< binary_search(a,a+6,77) << endl;
sort(a,a+6,Rule()); //按个位数从小到大排
Print(a,6);
cout <<”result:”<< binary_search(a,a+6,7) << endl;
cout <<”result:”<< binary_search(a,a+6,8,Rule()) << endl;//这里的8跟98的个位数相比
return 0;
}

输出结果: 3,7,12,21,45,98, result:1 result:0 21,12,3,45,7,98, result:0 result:1

用lower_bound二分查找下界

用法一:在对元素类型为T的从小到大排好序的基本类型的数组中进行查找 T * lower_bound(数组名+n1,数组名+n2,值); 返回一个指针 T * p; *p 是查找区间里下标最小的,大于等于”值” 的元素。如果找不到,p指向下标为n2 的元素

用法二:在元素为任意的T类型、按照自定义排序规则排好序的数组中进行查找 T * lower_bound(数组名+n1,数组名+n2,值,排序规则结构名()); 返回一个指针 T * p; *p 是查找区间里下标最小的,按自定义排序规则,可以排在”值”后面的元素。如果找 不到,p指向下标为n2的元素

用upper_bound二分查找上界

用法一:在元素类型为T的从小到大排好序的基本类型的数组中进行查找 T * upper_bound(数组名+n1,数组名+n2,值); 返回一个指针 T * p; *p 是查找区间里下标最小的,大于”值”的元素。如果找不到,p指向下标为n2的元素

用法二:在元素为任意的T类型、按照自定义排序规则排好序的数组中进行查找 T * upper_bound(数组名+n1,数组名+n2,值,排序规则结构名()); 返回一个指针 T * p; *p 是查找区间里下标最小的,按自定义排序规则,必须排在”值”后面的元素。如果找 不到,p指向下标为n2的元素

lower_bound,upper_bound用法示例:

#include
#include
#include
using namespace std;
struct Rule
{
bool operator()( const int & a1,const int & a2) {
return a1%10 < a2%10;
}
};
void Print(int a[],int size) {
for(int i = 0;i < size;++i) {
cout << a[i] << “,” ;
}
cout << endl;
}
#define NUM 7
int main()
{
int a[NUM] = { 12,5,3,5,98,21,7};
sort(a,a+NUM);
Print(a,NUM); // => 3,5,5,7,12,21,98,
int * p = lower_bound(a,a+NUM,5);
cout << *p << “,” << p-a << endl; //=> 5,1
p = upper_bound(a,a+NUM,5);
cout << *p << endl; //=>7
cout << * upper_bound(a,a+NUM,13) << endl; //=>21
sort(a,a+NUM,Rule());
Print(a,NUM); //=>21,12,3,5,5,7,98,
cout << * lower_bound(a,a+NUM,16,Rule()) << endl; // => 7
cout << lower_bound(a,a+NUM,25,Rule()) - a<< endl; // => 3
cout << upper_bound(a,a+NUM,18,Rule()) - a << endl; // => 7
if( upper_bound(a,a+NUM,18,Rule()) == a+NUM)
cout << “not found” << endl; //=> not found
cout << * upper_bound(a,a+NUM,5,Rule()) << endl; // =>7
cout << * upper_bound(a,a+NUM,4,Rule()) << endl; // =>5
return 0;
}