二分查找,二分查找變體:尋找大於等於k的元素;小於等於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)/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數組中(當然了,是要先排序的,畢竟是二分查找)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章