基本查找元素
int Binary_search(int x,int n,int arr[50005])
{
int low=0;int high=n-1;int middle=0;
while(low<=high)
{
middle=(low+high)/2;
if(arr[middle]==x) return middle;
else if(arr[middle]>x) high=middle-1;
else if(arr[middle]<x) low=middle+1;
}
return -1;
}
寻找小于等于k的值
int Binary_search(int x,int n,int arr[50005])
{
int low=0;int high=n-1;int middle=0;
while(low<high)
{
middle=(low+high+1)/2; //因为找小的,导致high最终为middle-1,value比target小,取加一 ;而low的变化始终等于middle
if(arr[middle]<=x) low=middle; //这就是我们最终的目的! @
else high=middle-1;
}
if(arr[low]>x) return -1;//#
else return low;
}
注意:如果是找小于的话,@处改成小于号,那么下面的出口#必须改成大于等于
寻找大于等于K的值
int Binary_search(int x,int n,int arr[50005])//最终high和low落在同一点!
{
int low=0;int high=n-1;int middle=0;
while(low<high)
{
middle=(low+high)/2; //唯一变化的!
if(arr[middle]>=x) high=middle; //这就是我们最终的目的
else low=middle+1;
}
if(arr[high]<x) return -1;
else return high;
}
补充:lower_bound&upper_bound(默认查询非降有序序列)
查询的是大于、等于
lower_bound:查询:查询大于等于key的元素地址,所以要减去首地址,才是下标。
实现:lower_bound(arr,arr+6,3)-arr;
upper_bound:查询:查询大于key的元素地址,所以要减去首地址,才是下标。
实现:upper_bound(arr,arr+6,3)-arr;
具体应用:1、如求与key值相等的元素个数,可以用lower_bound-upper_bound就是想等的元素
2、求小于等于key的个数,直接输出upper_bound(arr,arr+6,3)-arr恰好就是小于等于key的个数.
在降序序列中(查询小于、等于)
利用greater(),从而达到寻找小于等于、小于key值的元素
lower_bound(arr,arr+6,3,greater<int>())-arr;
upper_bound(arr,arr+6,3,greater<int>())-arr;
补充:其中lower_bound和upper_bound都要减去首地址;
且min_element和max_element也是要减去首地址的,在arr数组中(当然了,是要先排序的,毕竟是二分查找)