算法很美2.3 二分法

本文详细介绍了二分查找算法的基本前提、代码实现及不同退出条件。针对有序数组,二分查找能高效定位目标元素。文章探讨了两种二分法形式:一种是将搜索区间分为三个部分,另一种是划分为包含目标元素和不包含目标元素的两个区间。讨论了在不同情况下如何选择合适的退出循环条件,并强调了当`left=mid`时需要考虑向上取整的情况。此外,还提醒读者根据问题的具体需求来调整`if`逻辑分支条件。
摘要由CSDN通过智能技术生成

 参考:第 2 节 为什么取中间 | 算法吧 (suanfa8.com)

目录

二分法的前提:!!!!!有序!!!!!!!! 

 二分法代码:基本形式[三个区间]

1.在偶数个数字的时候  ,上文代码的写法默认是指向偏左边的数字

2.退出循环的条件

2.二分查找[划分为2个区间]

1.退出循环的条件

2.特别注意 如果出现了left=mid 则需要进行向上取整

如何选取合适的二分法?

1.while条件 

if()逻辑分支条件



二分法的前提:!!!!!有序!!!!!!!! 

 二分法代码:基本形式[三个区间] while(left<=right)

常见代码是把问题 划分为了三个区间   左  中间  右 

//二分查找   常见形式
	public int binsearch(int[] a,int k) {
		int left=0;
		int right=a.length-1;
		while(left<=right) {//搜索区间不为空
			int mid=left+((right-left)>>1);
			if(a[mid]>k) {
				left=mid+1;
			}else if(a[mid]<k){
				right=mid-1;
			}else {
				return mid;
			}
		}
		return -1;
	}

1.在偶数个数字的时候  ,上文代码的写法默认是指向偏左边的数字

也可以按照下图修改成指向偏右的数字. int mid =(left+right+1)/2

2.退出循环的条件

在此常规代码当中退出循环无非两种条件:

  1. right左移一位小于left
  2. left右移一位大于right

 但是对于具体那种情况往往不能够直接判断得出

2.二分查找[划分为2个区间] while(left<right)

划分为两个区间:1.包含待查找元素的区间   2.不包含待查找元素的区间

//二分查找
	public int binsearch(int[] a,int k) {
		int left=0;
		int right=a.length-1;
		while(left<right) {//搜索区间不为空
			int mid=left+((right+left)>>1);
			if(a[mid]<k) {
				left=mid+1;
			}else {
				//a[mid]>=k    即mid处的值可能为目标值
				right=mid;
			}
		}
		//退出循环的条件只有一种  left=right
		//我们只需单独判断 left=right时的值,是否为我们所需即可
		if(a[left]==k) {
			return left;
		}
		return -1;
	}

1.退出循环的条件

退出循环的条件为:left==right

我们只需单独判断left==right的时候的值是否是我们所需即可  

2.特别注意 如果出现了left=mid 则需要进行向上取整

https://suanfa8.com/binary-search/videos/04/

3.while(left + 1<right)  

 

 退出循环后具有两个元素,在循环体内对mid处的值进行了判断

 

如何选取合适的二分法?

1.while条件 

1.如果待查找的数据性质简单,我们可以采用3区间的方法

2.如果待查找的数据性质复杂,我们采用2区间的方法  但需要注意是向上取整还是向下取整【使用到left=mid   则上取整】

 

if()逻辑分支条件

根据具体题目来进行判断,有时从问题的反面出发反而更简单!

例如寻找<=  我们可以if(****>****)         else……

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值