前面已经有介绍二分搜索的了,这里再次贴出一个代码,这是《编程珠玑》第九章,对二分搜索的最后的优化。
还和前面一样,分成三个子程序,第一个函数binarySearch是典型的二分搜索,只不过把三次比较换成了两次,第二个函数binarySearchGe是返回搜索值target的最左边的一个,如果不存在,就返回第一个比target大的值的下标,如果没有就返回n;第三个函数binarySearchLe是返回搜索值target最右边的一个,如果不存在,则返回第一个比target小的值的下标。
#include<iostream>
using namespace std;
int binarySearch(int A[],int n,int target)
{
int lo=-1,hi=n;
while(lo+1!=hi)
{
int mid=lo+((hi-lo)>>1);
if(A[mid]<target)
lo=mid;//lo及其前面的都是<target的数
else
hi=mid;//hi及其后面都是>=target的数
}
if(hi>=n || A[hi]!=target)
return -1;
return hi;
}
int binarySearchGe(int A[],int n,int target)//等于的最左边或大于的第一个数
{
int lo=-1,hi=n;
while(lo+1!=hi)
{
int mid=lo+((hi-lo)>>1);
if(A[mid]<target)
lo=mid;//lo及其前面的都是<target的数
else
hi=mid;//hi及其后面都是>=target的数
}
return hi;//hi有可能是n,此时表示A中的n个数都小于target
}
int binarySearchLe(int A[],int n,int target)//等于的最右边或小于的第一个数
{
int lo=-1,hi=n;
while(lo+1!=hi)
{
int mid=lo+((hi-lo)>>1);
if(A[mid]<=target)
lo=mid;//lo及其前面的都是<target的数
else
hi=mid;//hi及其后面都是>=target的数
}
return lo;//lo有可能是-1,此时表示A中的n个数都大于target
}
int main()
{
int A[]={1,2,2,3,5,8,8,9};
int n;
while(cin>>n)
{
cout<<binarySearch(A,8,n)<<endl;
cout<<binarySearchLe(A,8,n)<<endl;
cout<<binarySearchGe(A,8,n)<<endl;
}
system("pause");
return 0;
}