二分查找基础
那么今天我们就来讲一下二分查找吧。。。
二分查找。二分:二等份的意思。那么二分查找的含义也就是每次二等份查找,不断缩小查找范围。
举个例子,假如我们要玩一个猜数字游戏,给定范围,你要做的就是在这个区间随机猜一个数字,判官会告诉你高了或者是低了,知道判官告诉你回答正确。这其实就是二分查找的核心思想。
二分查找可以用在多种途径,也可以用在大型的项目当中,可以起到点睛之笔的效果。
下面我们模拟二分查找,我们要做的事情就是,在【1,n】区间寻找正确答案x,
现在你理解二分查找的核心含义了吗?那么,下面用代码体现出来:
1 int a[n]; 2 int left = 1,right = n; 3 int mid,mark = 0; 4 while(left<=right){ 5 mid = (left+right)/2; //这里容易出现bug 6 if(a[mid]>=x){ //精简写法, 为了防止陷入死循环 7 mark = mid; 8 right = mid-1; 9 } 10 else{ 11 left = mid+1; 12 } 13 if(mark){ 14 cout<<mark<<endl; 15 } 16 }
上面第5行容易出bug,为什么呢,,当n足够大的时候,left+right容易爆int(意思是,int值很可能溢出),那么整个程序就错了,那么该如何解决呢,
不妨使用下面方法:
1 mid = left+((right-left)>>1);
扩充:1.number>>1 等同于 number/2 (值得注意的是,只限整型,所以这意味着,运算的结果是向下取整的数)
2.位运算的运算级别没有四则运算的高,所以说,,后面的内容必须要括号括起来
那么,初步的二分查找就是这样了。