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

本文介绍了一种高效的查找方法——二分查找法,并通过Java代码实现了该算法。文章以有序数组为例,详细阐述了二分查找的基本思想及其实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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


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

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值