前言
这几天觉得这些基础算法还是很有意思的,所以就继续“玩”了一下,又发现一个有趣的东西,建立排好序的集合基础上进行的算法——二分查找,这不刚刚弄懂了一点排序,就迫不及待的学起来了!!!
一、二分查找是什么?
二分查找是一种快速检索数据的算法,又称折半查找。
使用二分查找是需要前提的,被查找集合是有序的否则无法查找,查找到以后返回被查找数的索引(下标)。
二、原理分析
二分查找算法其实就是每次都查找中间那个数。如果排序是升序排列,将需要查找的数与中间数比较,如果是小于,那么这个数就在前半部分,如果是大于则就在后半部中去查找,如果排序是降序排列,则反之。按照这个规律依次查找,直到找到最后一个中间数,当然如果该集合中有这个数的话则返回下标,集合中么有这个数则返回-1;
三、过程演示
为了方便演示,我直接建立一个有序int类型数组按从小到大来排列{3,4,5,6,7,8},可以直接进行二分查找
查找元素4所在的位置
因为判断次数是未知的所以用while循环更方便
初始数组
索引 | minIndex = 0 | 1 | midindex = 2 | 3 | 4 | maxIndex = 5 |
---|---|---|---|---|---|---|
元素 | 3 | 4 | 5 | 6 | 7 | 8 |
经过第一次判断赋值后
索引 | minIndex=midIndex = 0 | maxIndex =1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|---|
元素 | 3 | 4 | 5 | 6 | 7 | 8 |
经过第二次判断赋值后
索引 0 | minIndex =maxIndex=midIndex =1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|---|
元素 | 3 | 4 | 5 | 6 | 7 | 8 |
这样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类型的数据做除法除不尽的结果是向下取整的
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/5070.html