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

来源:互联网 发布:在线预约系统asp源码 编辑:程序博客网 时间:2024/06/05 07:40


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


二分查找法 是对查找数据项 的这个动作的一个优化手段,它使用的前提为: 数据已经有序

下面让我们来用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;   }      }

           到此,二分查找的方法介绍完毕。是不是感觉很简单呢?



原创粉丝点击