中英代码理解数组的二分查找法

一、前言

二分查找法是一个非常高效的查找方法,但它的意义远不止快速查找这一功能,更重要的是它的思想对于以后的算法学习有比较大的帮助,二分的核心思想简单来说:每次都抛弃一半没用的数据。进而缩小查找的范围,提高效率。
对于一个数组想要使用二分查找法的前提是:数组的元素必须是有序的
但是对于初学者来说,理解二分并不容易。所以我用了中文版的代码和英文版的代码分别进行二分的实现,还将我个人的理解放上,让理解、掌握二分思想不再困难。

说明:
中文代码使用的编译语言:易语言
英文代码使用的编译语言:java

二、正文

为了方便对下面代码的理解呢,先上精华笔记,如果理解不了,就背这个,二分你是稳会的了。

核心思想:每次丢弃一半
1、初始化左起点(0), 初始化右终点(length - 1)
2、进入while循环
2-1、初始化中间值的下标---> 公式 :midIndex = left + ((right - left)>>1)
(理解:看成距离来计算下标)
2-2、初始化中间值:midVaule = arr[ midIndex ]
2-3、进行判断
2-3-1、如果当前目标值大于中间值,则需要在右半部分查找(升序排列)
则左起点需要往右移---> left = midIndex + 1;
2-3-2、如果当前目标值小于中间值,则需要在左半部分查找(升序排列)
则右终点需要左移---> right = midIndex - 1;
2-3-3、如果当前目标值==当前中间值,则return midIndex;
3、while结束,没有找到,则直接return -1;

然后我们先来看一下易语言代码的主要部分,看一下整个流程
这里主要看一下 子程序_二分查找
在这里插入图片描述
代码即注释,看不明白的话,也没关系,可能是语言不适应的原因,别怀疑自己的能力。
给一下运行结果吧。
在这里插入图片描述
查找9,返回的下标为4,因为易语言定义的数组下标从1开始。
接下来,我们重点看一下java代码的实现。

//二分查找
public class Demo18 {
	public static void main(String[] args) {
		System.out.println(binarySearch(new int[]{3, 4, 5, 9, 23, 27}, 9));
	}

	// 二分查找法
	public static int binarySearch(int[] arr, int target) {

		int left = 0; // 初始化起点
		int right = arr.length - 1; // 初始化终点

		while (left <= right) { // 如果两者没有重叠(即左部分去到右部分,临界点是相等)

			int midIndex = left + ((right - left) >> 1); // 中间坐标(使用了位运算提高效率)
			int midValue = arr[midIndex]; // 中间值

			if (target > midValue) { // 目标值与中间值进行比较
				left = midIndex + 1; // 当目标值在当前中间值的右边的时候起点右移到当前中间位置+1的位置
			} else if (target < midValue) {
				right = midIndex - 1; // 当目标值在当前中间值的左边的时候终点左移到当前中间位置-1的位置
			} else {
				return midIndex; // 相等则返回当前下标
			}
		}
		return -1; // while结束仍然没有找到,则返回-1
	}
}

运行结果

3

代码内的注释已经非常清晰,步骤与前面的笔记是一致吻合的。
当然,如果想要掌握,还需要进行最后一步的操作,那就是动手实现。这个非常重要。

PS:本人水平有限,如果文章有什么不对的地方请评论指正,在下感激不尽。

原创文章 16 获赞 4 访问量 1555

猜你喜欢

转载自blog.csdn.net/weixin_44702572/article/details/104402237