普通版本:
#include<iostream>
using namespace std;
int binarySearch(int *arr , int low , int high , int target)//递归实现
{
int middle = (low + high)/2;
if(low > high)
return -1;
if(arr[middle] == target)
return middle;
if(arr[middle] > target)
return binarySearch( arr , low , middle - 1 , target);
if(arr[middle] < target)
return binarySearch( arr , middle + 1 , high , target);
};
int binarySearch1(int a[], int n , int target)//循环实现
{
int low = 0 ,high = n , middle;
while(low < high)
{
middle = (low + high)/2;
if(target == a[middle])
return middle;
else if(target > a[middle])
low = middle +1;
else if(target < a[middle])
high = middle;
}
return -1;
};
int main()
{
int a[10] = {5,6,7,8,9, 10 , 11, 12 ,13, 14};
int index = binarySearch( a , 0 , 9 , 12);
cout<<index<< endl;
int index2 = binarySearch1(a,10,12);
cout<<index2<< endl;
system("pause");
}
STL版本:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[100]= {4,10,11,30,69,70,96,100};
int b=binary_search(a,a+9,4);//查找成功,返回1
cout<<"在数组中查找元素4,结果为:"<<b<<endl;
int c=binary_search(a,a+9,40);//查找失败,返回0
cout<<"在数组中查找元素40,结果为:"<<b<<endl;
int d=lower_bound(a,a+9,10)-a;
cout<<"在数组中查找第一个大于等于10的元素位置,结果为:"<<d<<endl;
int e=lower_bound(a,a+9,101)-a;
cout<<"在数组中查找第一个大于等于101的元素位置,结果为:"<<e<<endl;
int f=upper_bound(a,a+9,10)-a;
cout<<"在数组中查找第一个大于10的元素位置,结果为:"<<f<<endl;
int g=upper_bound(a,a+9,101)-a;
cout<<"在数组中查找第一个大于101的元素位置,结果为:"<<g<<endl;
}
几个函数的解释:
1 函数lower_bound() 参考:有关lower_bound()函数的使用
功能:函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置.
注意:如果所有元素都小于val,则返回last的位置,且last的位置是越界的!!
2 函数upper_bound()
功能:函数upper_bound()返回的在前闭后开区间查找的关键字的上界,返回大于val的第一个元素位置
注意:返回查找元素的最后一个可安插位置,也就是“元素值>查找值”的第一个元素的位置。同样,如果val大于数组中全部元素,返回的是last。(注意:数组下标越界)
PS:
lower_bound(val):返回容器中第一个值【大于或等于】val的元素的iterator位置。
upper_bound(val): 返回容器中第一个值【大于】
举个例子,1 2 3 5 序列中查找4
lower_bound(4) 是5的迭代器,upper_bound(4)也是5的迭代器,但binary_search(4) 返回的是false
而对于,1,2,3,4,4,4,4,5,6,7查找4
lower_bound(4)是第4个元素的迭代器,upper_bound(4)是5的迭代器,binary_search(4)返回的是true