赞
踩
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。(引用自百度百科)
二分查找(折半查找)算法,是数据结构中一个典型的算法,它的查询速度是非常快的,比较次数少,平均性能好。但是其也有缺点,缺点就是二分查找必须有个前提就是数组是有序的,而且插入删除都比较困难。
必须是一个有序的序列。
首先我们定义一个数组
int[] arr = {11, 22, 33, 44, 55, 66, 77};
二分查找是由两个变量:left索引和right索引控制查询范围,通过不断的折半范围来缩小查询区间实现查询数据。下面通过java语言来实现二分查找。
首先主方法内定义好数组arr,并且定义需要查询的值(这个值可以通过Scanner对象在控制台获取,为了演示我就直接赋值了),然后输出结果。
- public static void main(String[] args) {
-
- int[] arr = {11, 22, 33, 44, 55, 66, 77};
- //定义需要查询的值
- int select_value = 66;
- int index= getIndex(arr,select_value);
- System.out.println("查询值所对应的索引为:" + index);
- }
接下来就是定义一个方法用来实现二分查找了,这里我定义了一个有参有返回值的方法getIndex,里面传递了两个参数,一个为数组arr,另一个就是需要查询的值select_value。
- public static int getIndex(int[] arr,int select_value) {
-
- //初始化最小值的索引为0
- int left = 0;
- //初始化最大值的索引为arr.length-1
- int right = arr.length - 1;
-
- //首尾相加再除以2得出中间索引
- int mid = (left + right) / 2;
-
- while (left<=right) { //确保程序不会重复查询,不会越界
- if (select_value > arr[mid]) {
- //如果查询的值比中间值大,则往右边区域找,就把最小索引改为中间索引右移一位
- left = mid + 1;
- } else if (select_value < arr[mid]) {
- //如果查询的值比中间值小,则往左边区域找,就把最大索引改为中间索引左移一位
- right = mid - 1;
- } else {
- //剩余的情况就是查询到了结果,那么就直接返回索引。
- return mid;
- }
- mid = (left + right) / 2;
- }
- //没有查询到,则返回-1
- return -1;
- }
下面我就用图解的形式来分析一下具体的实现原理,纯手工制作,图丑大家勿喷0.0。
首先我们定义一个left和right变量,对应的就是数组的索引0和索引arr.length-1。
通过(left + right) / 2折半计算,我们算出mid=3的(java中int类型相除得出还是int类型,原本是3.5的值会被转变为int型变为3)。 此时arr[mid]的值为44,并不是我们寻找的66,通过比较66是比44大的,就会进入第一个if语句里面。
为了缩小范围进行查找,我们需要把left索引移到中间索引的右边,而right索引保持不变,此时原本索引0-6的范围瞬间缩小到了4-6,距离我们的目标66也越来越近。
我们此时再次进行(left + right) / 2折半计算,得到mid=5,此时mid索引就会移到到索引为5的位置,这时while循环并没有结束,再次while循环接着判断,发现这次arr[mid]的值刚好就是我们目标寻找的值66,那么就直接返回mid值为5,主方法里面通过调用getIndex方法获取到5,输出到控制台。
输出结果
这是目标值在右边的情况,左边的情况与右边原理相同,不同的是保持left位置不变,让right索引移到了中间索引mid的左边mid-1,这样就可以在左边区域进行寻找目标值。
欢迎大家指出不足的地方,我看到会在第一时间补充。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。