Java数据结构与算法之【二分查找】

实际上,我们对数据结构的操作无非是:  插入新的数据项、查找数据项、删除数据项 这三个主要的动作。

二分查找法 是对查找数据项 的这个动作的一个优化手段,它使用的前提为: 数据已经有序
下面让我们来用Java语言实现这个算法吧!

首先我们选取最简单的数据结构-----数组, 来实现这个算法。

 

//先定义一个有序的数组
int  a[ ]={12,22,34,45,54,67,88,102,123,150}  // 定义数组大小为10的简单类型数组

//常规的查找元素,比如查找88是否存在,一般是从a[0],a[1]...开始逐一进行相等的比较,直到匹配到a[6]==88才停下
// 因为该数组已经有序,我们可以使用二分查找法来实现对数组元素查找的优化。

算法思路:  

(1) 对数组正中间咔嚓来一刀,刚好砍到中间恰好是关键部位(刚好是88) 皆大欢喜,直接退出来,不用比较了,就是它了。(真可谓一步到位!)

                        

             然而现实往往是不如意的!被砍的中间部位,并非是所要查找的元素,这时候就得比较所查元素与中间项 值得大小,以便缩短比较距离。

                            

               选择第二段,也是从第二段中间开始砍,先看看是不是目标元素。否则,比较大小。再继续选择更小的一段。。。

                也就是说。。。除非我找到你(目标元素)了,不然我会一直砍下去。而且每砍一次,我就离你越来越近。(嘿嘿嘿。。是不是很阔怕)

                  一直做某件事,直到。。。  可以用 while(true){    }    循环语句。

             最终实现的代码如下:

                 

 //findnum 为所要查找的元素。函数返回 查找到的对应数组元素的角标。
public int find(int findnum){               
        int cur;
        int lower=0;  //  数组第一个元素角标
        int high=n-1;  // 数组最后一个元素角标
        while(true){
            
           cur=(lower+high)/2;
           if(a[cur]==findnum)  // 砍中了 直接跳出来,返回 匹配到的这个元素的角标
            return   cur;
           else if(lower>high)   // 砍过头了,失误了,砍错了。也退出来。
               return n;               // n对应的a[n]是不存在的~不存在的就是找不到咯。 a[n-1]才是最后一个元素。
           else{ 

           if(a[cur]>findnum)      // 这里做了选择,是第一段还是第二段。并相对应改变 头部或者尾巴。继续砍。
              high=cur-1; 
           else
               lower=cur+1;
           }
              
        }

 

posted on 2017-06-08 09:46  奇逸  阅读(259)  评论(0)    收藏  举报

导航