0
点赞
收藏
分享

微信扫一扫

算法很美2.3 二分法

盖码范 2022-02-06 阅读 93

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

目录

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

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

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

2.退出循环的条件

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

1.退出循环的条件

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


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

 

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

//二分查找   常见形式
	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

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

划分为两个区间: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/

 

举报

相关推荐

0 条评论