实际上,我们对数据结构的操作无非是: 插入新的数据项、查找数据项、删除数据项 这三个主要的动作。
二分查找法 是对查找数据项 的这个动作的一个优化手段,它使用的前提为: 数据已经有序。
下面让我们来用Java语言实现这个算法吧!
首先我们选取最简单的数据结构-----数组, 来实现这个算法。
//先定义一个有序的数组
int a[ ]={12,22,34,45,54,67,88,102,123,150}
//常规的查找元素,比如查找88是否存在,一般是从a[0],a[1]...开始逐一进行相等的比较,直到匹配到a[6]==88才停下
// 因为该数组已经有序,我们可以使用二分查找法来实现对数组元素查找的优化。
算法思路: (1) 对数组正中间咔嚓来一刀,刚好砍到中间恰好是关键部位(刚好是88) 皆大欢喜,直接退出来,不用比较了,就是它了。(真可谓一步到位!) 
然而现实往往是不如意的!被砍的中间部位,并非是所要查找的元素,这时候就得比较所查元素与中间项 值得大小,以便缩短比较距离。

![]()
选择第二段,也是先砍中间,看看是不是目标元素。否则,继续比较。
也就是说。。。除非我找到你了,不然我会一直砍下去。而且每砍一次,我就离你越来越近。(嘿嘿嘿。。
)
一直做某件事,直到。。。 可以用 while(true){ }
最终实现的代码如下:
public int find(int findnum){ //findnum 为所要查找的元素。函数返回 查找到的对应数组元素的角标。
int cur;
int low=0; // 数组第一个元素角标
int high=n-1; 数组最后一个元素角标
while(true){
cur=(low+high)/2;
if(a[cur]==findnum) // 砍中了 直接跳出来,返回 匹配到的这个元素的角标
return cur;
else if(low>high) // 砍过头了,失误了,砍错了。也退出来。
return n; // n对应的a[n]是不存在的~不存在的就是找不到咯。 a[n-1]才是最后一个元素。
else{
if(a[cur]>findnum) // 这里做了选择,是第一段还是第二段。并相对应改变 头部或者尾巴。继续砍。
high=cur-1;
else
low=cur+1;
}
}
到此,二分查找的方法介绍完毕。是不是感觉很简单呢?