《算法通关村——理解二分查找》

二分查找:也称为折半查找,是一种高效的查找算法,用于在有序数组中查找特定元素的位置。它的实现依赖于数组已经按升序或降序排列。

以下是二分查找的详细步骤:

  1. 确定查找范围:首先,确定待查找元素的范围。对于整个有序数组,初始范围是整个数组。用两个指针来表示范围的左边界(low)和右边界(high)。

  2. 计算中间位置:计算中间位置(mid)指针,mid = (low + high) / 2。如果数组长度为奇数,mid 就是正中间的元素;如果数组长度为偶数,mid 就是中间两个元素的左边那个。

  3. 判断中间元素:比较中间位置的元素与目标元素的大小关系。

    • 如果中间元素等于目标元素,说明找到了目标,返回中间位置mid。
    • 如果中间元素大于目标元素,说明目标元素可能在左半部分,更新high为mid - 1。
    • 如果中间元素小于目标元素,说明目标元素可能在右半部分,更新low为mid + 1。
  4. 缩小范围:根据步骤3的判断结果,不断缩小查找范围。重复步骤2和步骤3,直到找到目标元素或者范围缩小为空(即low > high)。

  5. 返回结果:如果找到目标元素,返回它的索引值;否则,返回-1表示未找到

注意事项:

  • 二分查找要求输入的数组是有序的,如果输入无序数组,需要先进行排序。
  • 当有多个相同的目标元素时,二分查找返回的是其中任意一个的索引。如果希望返回第一个或最后一个目标元素的索引,可以在查找到目标元素后,继续向左或向右查找。

 例如下图查找元素8的动态过程:

 代码实现方法一:while循环方式

//数组为查找的数组有序,整数b为要查找的元素,查找到返回元素的索引,否则返回-1
public static int er(int[] a,int b) {
		int low = 0;
		int high = a.length-1;
		int mid;
		while(low<=high) {
			mid = (low+high)/2;
			if(a[mid] == b) {
				return mid;
			}
			if(a[mid]>b) {
				high = mid -1;
			}
			if(a[mid]<b) {
				low = mid + 1;
			}
		}
		return -1;
	}

代码实现方法二:递归方式

//通过递归实现二分查找,返回目标值的索引
//a为数组,target为要查找的元素,low为在数组中开始查找的索引,high为在数组中结束的索引
	public static int biner(int a[],int target,int low,int high) {
		if(low<=high) {
			int mid = (low+high)/2;
			if(a[mid] == target) {
				return mid;
			}
			else if(a[mid]>target) {
				return biner(a, target, low, mid-1);
			}
			else {
				return biner(a, target, mid+1, high);
			}
		}else {
			return -1;
		}
	}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值