#include<iostream>
#include <map>
using namespace std;
//查找给值的元素
int bsearch(int a[],int n,int value){
int low=0,high=n-1;
while (low<=high){
int mid = low +((high - low )>>1);
if(value == a[mid]){
return mid;
} else if(value > a[mid]){
low = mid + 1;
} else{
high = mid -1;
}
}
return -1;
}
//查找第一个等于给定值的元素
int left_first_bsearch(int a[],int n,int value){
int low=0,high = n-1;
while (low<=high){
int mid = low + ((high - low)>>1);
if(a[mid]>value){
high = mid -1;
} else if(a[mid] < value){
low = mid + 1;
} else {
if((mid==0)||(a[mid-1]!=value)){
return mid;
} else{
high = mid-1;
}
}
}
return -1;
}
//查找最后一个大于等于给定值的元素
int right_end_bsearch(int a[],int n,int value){
int low=0,high=n-1;
while (low<=high){
int mid = low + ((high - low)>>1);
if(a[mid]>value){
high = mid -1;
} else if(a[mid] < value){
low = mid + 1;
} else {
if((mid==n-1)||(a[mid+1]!=value)){
return mid;
} else{
low = mid+1;
}
}
}
return -1;
}
//查找第一个大于等于给定值的元素
int first_more_bsearch_1(int a[],int n,int value){
int low=0,high=n-1;
while (low<=high){
int mid=low + ((high-low)>>1);
if(a[mid]<=value){
low=mid+1;
} else{
high=mid-1;
}
}
return low<n?low:-1;
}
//查找第一个大于等于给定值的元素
int first_more_and_equal_bsearch_2(int a[],int n,int value){
int low=0,high=n-1;
while (low<=high){
int mid=low + ((high-low)>>1);
if(a[mid]>=value){
if((mid==0)||(a[mid-1]<value)){
return mid;
} else{
high=mid-1;
}
} else{
low=mid+1;
}
}
return -1;
}
//查找最后一个小于等于给定值的元素
int end_less_and_equal_bsearch(int a[],int n,int value){
int low=0,high=n-1;
while (low<=high){
int mid=low + ((high-low)>>1);
if(a[mid]<=value){
if((mid==n-1)||(a[mid+1]>value)){
return mid;
}else{
low=mid+1;
}
} else{
high=mid-1;
}
}
return -1;
}
int main()
{
int a[]={1,3,4,5,6,8,8,8,8,8,8,11,18};
cout<<bsearch(a,10,8)<<endl;
cout<<left_first_bsearch(a,10,8)<<endl;
cout<<right_end_bsearch(a,10,8)<<endl;
cout<<first_more_and_equal_bsearch_2(a,13,6)<<endl;
cout<<end_less_and_equal_bsearch(a,13,7)<<endl;
return 0;
}
二分搜索的几种变形
最新推荐文章于 2022-01-14 13:45:37 发布