目录
情景
你有一本英汉词典,里面的单词均按照字典序排序。可是不幸的,这本字典的索引已经被撕烂了,至于是谁撕烂的我们不管他。现在你要查“cat”这个单词,拥有强迫症的你只能使用一下两种搜索方法:
(1)一页一页的翻
(2)二分查找
很明确,最简单的方法就是第一种,可是问题是,这本字典有1000页......
所以,你正确的选择了二分查找。
二分查找
具体的说,你先从字典中间翻开,发现是M开头的单词。很明显,m比c大。所以你又将左边的那一半(即比m小的那一半)接着对半分,发现是F开头……以此类推,直到查到cat为止。
这,就是二分查找。
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少,所以十分好用。不过二分查找只能查找有序序列。
二分查找的大致过程如下:
代码
我们如何实现二分查找呢?
比如:
请在一个拥有n个数字的升序序列中查找p,若p不存在,输出-1,否则输出p的位置(即第几个数)。
代码如下:
#include<iostream>
using namespace std;
int a[1000005];//n最大10的6次方
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int q;
cin>>q;
int l=1,r=n,ans=-1;//l表示起点,r表示终点
while(l<r){
int mid=(l+r)/2;
if(mid>=q){
r=mid-1;
ans=mid;
}else{
l=mid+1;
}
}
cout<<ans<<endl;
return 0;
}