基本查找元素
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數組中(當然了,是要先排序的,畢竟是二分查找)