二分查找

二分查找思路很简单,但要把程序写对,却很难,有兴趣的话,可以在网上查一下相关资料,下面给出两种常见的错误:(至于具体错误原因,可以分析程序的执行)

错误程序1:

#include <iostream>
using namespace std;
 
int binarySearch(int a[], int n, int key)
{
	int low = 0;
	int high = n - 1;
	int mid;
	while(low < high)        //key可能刚好在low与high相等的地方
	{
		mid = (low + high)/2;
		if(key == a[mid])
			return mid;
 
		if(key < a[mid])
			high = mid - 1;
		else
			low = mid + 1;
	}
 
	return -1;
}
 
int main()
{
	int a[] = {0, 1, 2};
	int n = 3;
	int key = 0;
	int result = binarySearch(a, n, key);
 
	if(-1 == result)
		cout << "no" << endl;
	else
		cout << "yes! location: " << result + 1 << endl;
 
	return 0;
}

错误程序2:

#include <iostream>
using namespace std;
 
int binarySearch(int a[], int n, int key)
{
	int low = 0;
	int high = n - 1;
	int mid;
	while(low < high)        //可能是死循环
	{
		mid = (low + high)/2;
		if(key == a[mid])
			return mid;
 
		if(key < a[mid])
			high = mid;
		else
			low = mid;
	}
 
	return -1;
}
 
int main()
{
	int a[] = {0, 1, 2};
	int n = 3;
	int key = 100;
	int result = binarySearch(a, n, key);
 
	if(-1 == result)
		cout << "no" << endl;
	else
		cout << "yes! location: " << result + 1 << endl;
 
	return 0;
}

 正确程序如下:

#include <iostream>
using namespace std;
 
int binarySearch(int a[], int n, int key)
{
	int low = 0;
	int high = n - 1;
	int mid;
	while(low <= high)
	{
		mid = (low + high)/2;  // 网友“乐行僧”和“eewcee”在评论中说这里可能溢出。确实如此,可以继续优化。具体方法“乐行僧”已经在评论中给出了。 非常感谢。学习了。
		if(key == a[mid])
			return mid;
 
		if(key < a[mid])
			high = mid - 1;
		else
			low = mid + 1;
	}
 
	return -1;
}
 
int main()
{
	int a[] = {0, 1, 2};
	int n = 3;
	int key = 0;
	int result = binarySearch(a, n, key);
 
	if(-1 == result)
		cout << "no" << endl;
	else
		cout << "yes! location: " << result + 1 << endl;
 
	return 0;
}```
前Facebook工程师 打造王者级课程                            覃超 Facebook 早期员工&多年面试官、曾作为 Facebook Messenger Tech Lead,主导和参与了 Facebook App、Facebook Messenger、Facebook Phone 等产品的研发工作。 现在,覃超老师致力于计算机科学领域的培训指导,经他指导的学生,90%以上拿到了硅谷公司或国内顶级互联网公司的offer。 推动0到3岁程序员 打通职业发展路径 数据结构与算法计算机学科知识结构的核心和技术体系的基石,随着科技的飞速发展,数据结构的基础性地位反而更加坚固,是每一个程序员必须掌握的底层核心技能! 多岗位必备技能 快速提升编程内功   作为一名程序员,无论是任何岗位,掌握数据结构与算法,就可以在面试前建立自己的算法技术体系,同时有助于更好地阅读源码和设计编写一些复杂的工具,快速提升编程内功! 建立框架性知识体系 覆盖重要知识点 很多人认为可能除了面试,之后再也用不到据结构与算法了,但是如果程序员想拔高一个层次,数据结构与算法是很重要的一部分,《全解数据结构与算法》帮你完成角色的转变! 透彻讲解底层核心原理 拓展能力上限 很多人认为可能除了面试,之后再也用不到据结构与算法了,但是如果程序员想拔高一个层次,数据结构与算法是很重要的一部分,《全解数据结构与算法》帮你完成角色的转变!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值