不同情况下的二分搜索模板
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~
http://www.cnblogs.com/chenxiwenruo/p/8538760.html
特别不喜欢那些随便转载别人的原创文章又不给出链接的
所以不准偷偷复制博主的博客噢~~
二分搜索算是常见的搜索方式了,由于有时候经常会遇到返回值不同的情况出现,所以就把能想到的几个整理了下。
1.如果存在,返回对应的索引(任意一个即可);如果不存在,返回-1
/* a为已经排序好的数组,t为要查找的目标值,n为数组长度 如果存在,返回任意一个索引即可 如果不存在,返回-1 */ int binarySearch(int *a,int t,int n){ int l=0,r=n-1; int mid; //注意这里是l<=r while(l<=r){ mid=(l+r)>>1; if(a[mid]==t) return mid; if(t<a[mid]) r=mid-1; else l=mid+1; } return -1; }
2.如果存在多个目标值t,返回最小的索引;如果不存在,返回-1
/* a为已经排序好的数组,t为要查找的目标值,n为数组长度 如果存在多个目标值t,返回最小的索引 如果不存在,返回-1 */ int binarySearchMinIdx(int *a,int t,int n){ int l=0,r=n-1; int mid; while(l<r){ mid=(l+r)>>1; printf("%d %d %d\n",l,r,mid); //注意,由于是返回索引值最小的,所以这里r=mid,而不是mid-1,因为mid也有可能是最终的结果。 if(t<=a[mid]) r=mid; else l=mid+1; } //while条件结束时,l==r,因此判断a[l]是否=t即可 if(a[l]==t) return l; else return -1; }
反之,也有返回最大的索引。拿做数学题经常用的话语来讲,同理即可,就是任性。
3.返回 值<=t的索引,若不存在,返回0(也可以自己改为-1,加个条件而已)
注意,第3个和第4个,是在a[1~n]中搜索,而不是在a[0~n-1]中搜索。
可以自己尝试去写在[0~n-1]中搜索的情况,其实差不多的,只不过最后返回的时候要多几个判断条件
/* 在数组a[1~n]中搜索t 若t在,则返回t的索引 若t不在a中,则返回的是比t小的索引 如果没有比t小的,则返回0 */ int binarySearchSmallOrSmaller(int *a,int t,int n){ int l=0,r=n+1; int mid; //注意这里为啥是l<r-1,因为下面l=mid,r=mid,所以当最后若对于l=r-1,t>=a[l],就会陷入死循环 while(l<r-1){ mid=(l+r)>>1; if(a[mid]<=t) l=mid; else r=mid; } return l; }
4.返回 值>=t的索引,若不存在,返回n+1(也可以自己改为-1,加个条件判断一下即可)
/* 在数组a[1~n]中搜索t 若t在,则返回t的索引 若t不在a中,则返回的是比t大的索引 如果没有比t大的,则返回n+1 */ int binarySearchLargeOrLarger(int *a,int t,int n){ int l=0,r=n+1; int mid; while(l<r-1){ mid=(l+r)>>1; if(a[mid]>=t) r=mid; else l=mid; } return r; }