使用前提:
这个数列是一个有序数列,也就是0,1,4,6,7,88这样的
原理:
给出一个范围l到r,然后不断利用mid=(l+r)缩小范围,每次只取分成两半后的其中一边减一点(减一点的意思是减1,比如说既然array[mid]不是答案,那么下一次边界不用mid而用mid旁边的那个)
时间复杂度:O(logn)
图解:
然后放代码:
这是一个返回,如果数列范围中有这个就返回1,否则返回0
int binary_search(int l,int r,int key) { while(l<r) { int mid=(l+r)/2; if(key<array[mid])r=mid-1; else if(key>array[mid])l=mid+1; else return 1; }
return 0; }
比赛极速版
比赛的时候争分夺秒,哪怕懂原理,也最好一个算法的最短代码打到滚瓜烂熟,肯定是好的
int bs(int l,int r,int k) { while(l<r) { int d=(l+r)/2; if(k<a[d])r=d-1; else if(k>a[d])l=d+1; else return 1; } return 0; }
int bs(int l,int r,int k) {while(l<r){int d=(l+r)/2;if(k<a[d])r=d-1;else if(k>a[d])l=d+1;else return 1;}return 0;}