二分搜索无处不在,但是写好一个二分搜索却还需要躲避一些陷阱。
第一篇二分搜索论文在1946年就发表了,但是第一个没有错误的二分搜索程序却直到1962年才出现。
问题:给定一个有序数组,包含【1...n】,以及一个目标值。搜索目标值并返回。
int guessNumber(int n, int target){
int left = 1, right = n, m = 0;
while (left <= right)
{
m = left + (right - left)/2;
if (m == target)
return m;
if(m > target)
right = m ;
else
left = m ;
}
return m;
}
程序看起来非常简单,且对于绝大多数数据都能执行正确。
但是,如果输入是 2,2
数组内容为;[1,2],搜索 2.
left = 1 right = 2 。 m = 1
此时会陷入死循环。
正确程序:
int guessNumber(int n, int target){
int left = 1, right = n, m = 0;
while (left <= right)
{
m = left + (right - left)/2;
if (m == target)
return m;
if(m > target)
right = m - 1;
else
left = m + 1;
}
return m;
}
举例 1.......m........n
如果m < target 说明target在后半部分,则新的区间应为[m+1,n],而非[m,n].
同理,如果m > target, 说明target在前半部分,新区间应为:[1,m-1],而非[1,m].
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。