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小时内与您取得联系。