二分查找


前言

这几天觉得这些基础算法还是很有意思的,所以就继续“玩”了一下,又发现一个有趣的东西,建立排好序集合基础上进行的算法——二分查找,这不刚刚弄懂了一点排序,就迫不及待的学起来了!!!

一、二分查找是什么?

二分查找是一种快速检索数据的算法,又称折半查找。
使用二分查找是需要前提的,被查找集合是有序的否则无法查找,查找到以后返回被查找数的索引(下标)。

二、原理分析

二分查找算法其实就是每次都查找中间那个数。如果排序是升序排列,将需要查找的数与中间数比较,如果是小于,那么这个数就在前半部分,如果是大于则就在后半部中去查找,如果排序是降序排列,则反之。按照这个规律依次查找,直到找到最后一个中间数,当然如果该集合中有这个数的话则返回下标,集合中么有这个数则返回-1;

三、过程演示

为了方便演示,我直接建立一个有序int类型数组按从小到大来排列{3,4,5,6,7,8},可以直接进行二分查找
查找元素4所在的位置
因为判断次数是未知的所以用while循环更方便

初始数组

索引minIndex = 01midindex = 234maxIndex = 5
元素345678

经过第一次判断赋值后

索引minIndex=midIndex = 0maxIndex =12345
元素345678

经过第二次判断赋值后

索引 0minIndex =maxIndex=midIndex =12345
元素345678

这样array[midindex] = 4 就是我们要找的数,返回4所在的下标。

四、代码实现

代码如下(示例):

public class Test03 {

	public static void main(String[] args) {
		int[] array = {3,4,5,6,7,8}; // 创建一个int类型的数组
		int index = binSearch(array, 4);// 调用binSearch方法传入需要的参数,且接受返回值
		System.out.println(index);
	}
	public static int binSearch(int[] array,int value) {//创建binSearch方法带两个参数,一个是int数组,一个是整数,且有int返回值
		int maxIndex  = array.length-1; //根据数组元素设置最大下标
		int minIndex =0;//设置最小下标
		int midIndex = (maxIndex+minIndex)/2;//根据最大和最小下标得出中间下标(注意:int类型的除法是向下取整)
		while(array[midIndex]!=value) {//判断中间下标对应的值是否是需要查找的值
			if(maxIndex>=minIndex) {// 加强判断,正常情况下minIndex是不能大于maxIndex,加强代码的健壮性
				if(array[midIndex]>value) {//判断如果中间下标对应的值大于需要查找的值,则更改最大下标为midIndex-1
					maxIndex = midIndex-1;
				}else if(array[midIndex]<value) {//判断如果中间下标对应的值小于需要查找的值,则更改最大下标为midIndex+1
					minIndex = midIndex+1;
				}
				midIndex = (maxIndex+minIndex)/2;//从新赋值给中间下标(midIndex)
			}else {
				midIndex = -1; // 如果输入的值在被查找的集合中不存在,则返回-1提醒
				break; //退出整个进程
			}
		}
		return midIndex;
	}
}

代码如下(输出):

1

总结

其实对于这些基础算法个人觉得懂原理比较重要,因为原理只有一个但是实现方式多种多样,还有需要注意的是int类型的数据做除法除不尽的结果是向下取整的

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值