全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

java 二分法算法的实例

java 二分法算法的实例

1、前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序

2、原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后;将要查找的值和数组的中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回。然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分。可能描述得不是很清楚,若是不理解可以去网上找。从描述上就可以看出这个算法适合用递归来实现,可以用递归的都可以用循环来实现。所以我们的实现分为递归和循环两种,可以根据代码来理解算法

3、实现

代码如下

 
package org.cyxl.algorithm.search; 
 
/** 
 * 二分查找 
 * @author cyxl 
 * 
 */ 
public class BinarySearch { 
  private int rCount=0; 
  private int lCount=0; 
   
  /** 
   * 获取递归的次数 
   * @return 
   */ 
  public int getrCount() { 
    return rCount; 
  } 
 
  /** 
   * 获取循环的次数 
   * @return 
   */ 
  public int getlCount() { 
    return lCount; 
  } 
 
  /** 
   * 执行递归二分查找,返回第一次出现该值的位置 
   * @param sortedData  已排序的数组 
   * @param start     开始位置 
   * @param end      结束位置 
   * @param findValue   需要找的值 
   * @return       值在数组中的位置,从0开始。找不到返回-1 
   */ 
  public int searchRecursive(int[] sortedData,int start,int end,int findValue) 
  { 
    rCount++; 
    if(start<=end) 
    { 
      //中间位置 
      int middle=(start+end)>>1;  //相当于(start+end)/2 
      //中值 
      int middleValue=sortedData[middle]; 
       
      if(findValue==middleValue) 
      { 
        //等于中值直接返回 
        return middle; 
      } 
      else if(findValue<middleValue) 
      { 
        //小于中值时在中值前面找 
        return searchRecursive(sortedData,start,middle-1,findValue); 
      } 
      else 
      { 
        //大于中值在中值后面找 
        return searchRecursive(sortedData,middle+1,end,findValue); 
      } 
    } 
    else 
    { 
      //找不到 
      return -1; 
    } 
  } 
   
  /** 
   * 循环二分查找,返回第一次出现该值的位置 
   * @param sortedData  已排序的数组 
   * @param findValue   需要找的值 
   * @return       值在数组中的位置,从0开始。找不到返回-1 
   */ 
  public int searchLoop(int[] sortedData,int findValue) 
  { 
    int start=0; 
    int end=sortedData.length-1; 
     
    while(start<=end) 
    { 
      lCount++; 
      //中间位置 
      int middle=(start+end)>>1;  //相当于(start+end)/2 
      //中值 
      int middleValue=sortedData[middle]; 
       
      if(findValue==middleValue) 
      { 
        //等于中值直接返回 
        return middle; 
      } 
      else if(findValue<middleValue) 
      { 
        //小于中值时在中值前面找 
        end=middle-1; 
      } 
      else 
      { 
        //大于中值在中值后面找 
        start=middle+1; 
      } 
    } 
    //找不到 
    return -1; 
  } 
} 

4、测试代码  

package org.cyxl.algorithm.search.test; 
 
import org.cyxl.algorithm.search.BinarySearch; 
import org.junit.Test; 
 
 
public class BinarySearchTest { 
  @Test 
  public void testSearch() 
  { 
    BinarySearch bs=new BinarySearch(); 
     
    int[] sortedData={1,2,3,4,5,6,6,7,8,8,9,10}; 
    int findValue=9; 
    int length=sortedData.length; 
     
    int pos=bs.searchRecursive(sortedData, 0, length-1, findValue); 
    System.out.println("Recursice:"+findValue+" found in pos "+pos+";count:"+bs.getrCount()); 
    int pos2=bs.searchLoop(sortedData, findValue); 
     
    System.out.println("Loop:"+findValue+" found in pos "+pos+";count:"+bs.getlCount()); 
  } 
} 

5、总结:这种查找方式的使用场合为已排序的数组。可以发现递归和循环的次数是一样的

以上就是java 二分法的实例详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# java  # 二分法  # 二分法的实例  # 二分法实现方法  # Java经典排序算法之二分插入排序详解  # Java实现二分查找算法实例分析  # java算法之二分查找法的实例详解  # 一文详解Java二分查找算法  # Java二分查找算法实现代码实例  # java 算法二分查找和折半查找  # Java 二分法检索算法代码实现详解  # Java 二分查找算法的实现  # Java二分查找算法实例详解  # Java二分算法题目练习实战教程  # 递归  # 找不到  # 可以用  # 则在  # 来实现  # 组中  # 为三  # 是一个  # 升序  # 如有  # 两种  # 希望能  # 很清楚  # 谢谢大家  # 可以根据  # 不理解  # 就可以  # 默认为  # 疑问请  # 后半部 


相关文章: 小程序网站制作需要准备什么资料,如何制作小程序?  实例解析Array和String方法  重庆网站制作公司哪家好,重庆中考招生办官方网站?  如何通过商城自助建站源码实现零基础高效建站?  利用JavaScript实现拖拽改变元素大小  建站之星后台密码遗忘如何找回?  Android自定义控件实现温度旋转按钮效果  如何通过虚拟主机快速搭建个人网站?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何快速搭建支持数据库操作的智能建站平台?  建站之星如何助力企业快速打造五合一网站?  如何快速使用云服务器搭建个人网站?  如何续费美橙建站之星域名及服务?  如何选择建站程序?包含哪些必备功能与类型?  小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?    如何零基础开发自助建站系统?完整教程解析  建站之星如何优化SEO以实现高效排名?  如何通过西部数码建站助手快速创建专业网站?  ,制作一个手机app网站要多少钱?  广州美橙建站如何快速搭建多端合一网站?  宁波免费建站如何选择可靠模板与平台?  代刷网站制作软件,别人代刷火车票靠谱吗?  如何在建站主机中优化服务器配置?  韩国服务器如何优化跨境访问实现高效连接?  如何选择香港主机高效搭建外贸独立站?  如何在景安云服务器上绑定域名并配置虚拟主机?  建站之星价格显示格式升级,你的预算足够吗?  如何快速登录WAP自助建站平台?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  昆明网站制作哪家好,昆明公租房申请网上登录入口?  c++怎么用jemalloc c++替换默认内存分配器【性能】  如何正确下载安装西数主机建站助手?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  深圳企业网站制作设计,在深圳如何网上全流程注册公司?  如何通过VPS建站实现广告与增值服务盈利?  如何选择高效可靠的多用户建站源码资源?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  如何通过老薛主机一键快速建站?  如何通过免费商城建站系统源码自定义网站主题与功能?  想学网站制作怎么学,建立一个网站要花费多少?  如何配置WinSCP新建站点的密钥验证步骤?  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  家具网站制作软件,家具厂怎么跑业务?  如何在腾讯云服务器上快速搭建个人网站?  香港服务器如何优化才能显著提升网站加载速度?  动图在线制作网站有哪些,滑动动图图集怎么做? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。