东哥说算法——聊聊查找算法一家子

前言

以下所有的查找算法全部针对如下问题:
设计一个方法,用于在指定的数组中查找指定的值。若找到,返回下标;否则返回 -1.
算法将会不断补充,欢迎喜欢的小伙伴们持续关注。
如果对你有帮助,欢迎点赞哦!(づ ̄3 ̄)づ╭❤~

方法一:顺序查找

1. 顺序查找是啥?

顺序查找,顾名思义,就是按照从头到尾的顺序遍历一遍数组

2. 代码实现

public static int sequentialSearch(int arr[], int num){
	for (int i = 0; i < arr.length; i++) {
            if(arr[i] == num){
                return i;
            }
        }
     return -1;
}

public static void main(String[] args) {
        System.out.println(sequentialSearch(new int[]{1,2,3,4}, 3));
}

控制台输出结果如下(数组的脚标是从0开始的哦):
在这里插入图片描述

方法二:二分查找

1. 二分查找是啥?

有这样的一个数组,数组元素是有序排列的。其内部存储如下元素:4、5、7、8、9。同时蓝色指明的是范围的起始(leftIndex)橙色是范围的结束(rightIndex)
在这里插入图片描述
现在,我们想要查询 8 是否在数组中。(目的)

首先,我们取出该范围中处在中间位置的元素 7 与 所要查找的 8 进行比较。
在这里插入图片描述
我们发现8大于7,此时舍去中间元素的左边部分,只保留右边部分。
在这里插入图片描述
继续之前的操作,选出这一部分的中间元素,与8进行比较。
在这里插入图片描述
我们发现该元素就是我们所要的元素,返回数组内该元素的下标,二分查找完成。

在整个流程中,我们可以发现每次取出比较都可以舍去现有的一半元素,相较于顺序查找,其效率大大提升。

2. 关键点提炼

仔细观察整个流程我们可以发现有以下几个关键点。

  1. 确定中间标尺(midIndex)并取出中间元素的值(midValue)midIndex = leftIndex + ((rightIndex - leftIndex) >> 1);midValue = arr[midIndex]
  2. 左右标尺的移动。如果我们想要查找的值(targetValue)大于中间元素的值(midValue),即 targetValue > midValue,那么左标尺(leftIndex)移动到中间标尺(midIndex)右边一位,即 leftIndex = midIndex + 1。如果我们想要查找的值(targetValue)小于中间元素的值(midValue),即 targetValue < midValue,那么右标尺(rightIndex)移动到中间标尺左边一位,即rightIndex = midValue - 1
  3. 何时停止移动左右标尺。当左右标尺相遇或相错或者我们寻找到了想要查找的目标值,那么我们就可以停止移动标尺了。

3. 代码实现

public static int binarySearch(int[] arr, int targetValue){
	// 左右标尺初始化
	int leftIndex = 0;
	int rightIndex = arr.length - 1;
	
	// 3. 左右标尺移动终止条件之一,左右标尺相遇或相错
	while(leftIndex <= rightIndex){
		// 1. 确定中间标尺
		int midIndex = leftIndex + ((rightIndex - leftIndex) >> 1);
		// 1. 取出中间标尺位置的元素
		int midValue = arr[midIndex]; 
		// 2. 左右标尺移动
		if(targetValue > midValue){ // 查找的值大于中间元素 
			leftIndex = midIndex + 1; // 移动左标尺
		}else if(targetValue < midValue){ // 查找的值小于中间元素
			rightIndex = midIndex - 1; // 移动右标尺
		}else{ // 3. 查找的值等于中间元素 左右标尺移动终止条件之二
			return midIndex;
		}
	}
	return -1; // 3. 没有查找到targetValue
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.Persimmon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值