详解二分查找的两种写法以及二分查找的六种变形

本文介绍了二分查找的两种基本写法,包括左闭右闭和左闭右开,并详细讨论了六种二分查找的变形,如查找第一个等于、大于等于、大于、小于等于、小于目标值的元素位置。同时,提出了在排序数组中查找元素起始和结束位置的问题,并给出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、二分查找的两种写法

1.1 - 第一种写法(左闭右闭)

1.2 - 第二种写法(左闭右开)

二、二分查找的六种变形

2.1 - 查找第一个 = target 的元素位置

2.2 - 查找第一个 >= target 的元素位置

2.3 - 查找第一个 > target 的元素位置

2.4 - 查找最后一个 = target 的元素位置

2.5 - 查找最后一个 <= target 的元素位置

2.6 - 查找最后一个 < target 的元素位置

三、 在排序数组中查找元素的第一个和最后一个位置



一、二分查找的两种写法

二分查找也成为折半查找(Binary Search),它是一种效率较高的查找方法。但是该方法要求待查找的序列必须是有序的,即序列中所有的元素都是按照升序(递增)或降序(递减)排列的

二分查找的思想很简单,即选择序列中间的数字和目标值进行比较(假设序列是按升序排列的):

  1. 如果中间的数字小于目标值,说明包括中间数字在内的左半边区间的所有数字都小于目标值,可以全部排除。

  2. 如果中间的数字大于目标值,说明包括中间数字在内的右半边区间的所有数字都大于目标值,可以全部排除。

  3. 如果中间的数字等于目标值,则直接返回答案。

练习704. 二分查找

1.1 - 第一种写法(左闭右闭)

左闭右闭,即每次查找的区间为 [left, right]

int binarySearch(int arr[], int size, int target)
{
	int left = 0;
	int right = size - 1;
	while (left <= right)
	{
		int mid = (left + right) / 2;
        // int mid = left + (right - left) / 2;
		if (arr[mid] < target)
		{
			left = mid + 1;
		}
		else if (arr[mid] > target)
		{
			right = mid - 1;
		}
		else
		{
			return mid;
		}
	}
	return -1;
}

1.2 - 第二种写法(左闭右开)

左闭右开,即每次查找的区间为 [left, right),此时 arr[right] 不存在或者不符合条件。因此写法二的代码要做如下几处的修改:

  1. right 要初始化为 size

  2. while 的循环条件应该改为 left < right

  3. arr[mid] > target 时,right = mid

int binarySearch(int arr[], int size, int target)
{
	int left = 0;
	int right = size;
	while (left < right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] < target)
		{
			left = mid + 1;
		}
		else if (arr[mid] > target)
		{
			right = mid;
		}
		else
		{
			return mid;
		}
	}
	return -1;
}


二、二分查找的六种变形

2.1 - 查找第一个 = target 的元素位置

此时待查找的序列是按照非递减或者按非递增的顺序排列的,

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值