很多程序员都无法写出正确的二分查找

二分查找很多人都不陌生,它能高效的查找顺序数组里的特定值所在的位置。但有多少人能清楚地说出二分查找区间缩小过程中的边界要不要-1,while循环条件要不要加=号,二分查找有几种写法。
今天,我们就详细讲讲二分查找,让更多人弄清楚二分查找的正确写法。

易错点:边界处理

举个例子:假设下图(查找区间为左闭右开区间)想要查找4,当发现arr[mid] > 4时错将end转移到mid-1处,这样一来查找区间变为[0,4),不管怎么找都找不到4了,就会造成bug。
请添加图片描述
既然了解了错误原因,解决问题就变得简单了起来,根本上就是要重视边界处理,什么时候要加一什么时候要减一,还有跳出循环的条件中要不要等号,这些都一定要搞清楚。

示例

以下是二分查找(折半查找)的两种正确写法。大家可以作为参考。

//左闭右闭区间                                     
int BinarySearch1(int* a, int n, int x)
{
	assert(a);
	int begin = 0;
	int end = n - 1;

	while (begin <= end)
	{
		int mid = begin + ((end - begin) >> 1);//防溢出,>>运算符优先级很低,要再加一个括号
		if (a[mid] < x)
			begin = mid + 1;
		else if (a[mid] > x)
			end = mid - 1;
		else
			return mid;	 
	}
	return -1;
}
//左闭右开区间     
int BinarySearch2(int* a, int n, int x)
{
	assert(a);
	int begin = 0;
	int end = n;

	while (begin < end)
	{
		int mid = begin + ((end - begin) >> 1);//防溢出,>>运算符优先级很低,要再加一个括号
		if (a[mid] < x)
			begin = mid + 1;
		else if (a[mid] > x)
			end = mid;
		else
			return mid;
	}
	return -1;
}

细节要记得处理到位,大家加油!

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天影云光

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

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

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

打赏作者

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

抵扣说明:

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

余额充值