有坑的二分查找算法[求助]
题目来源:http://blog.csdn.net/fox2790/article/details/8348427
22、下面的函数使用二分查找算法,对已按升序排序的数组返回所要查找数值的数据位置,请填写缺少的两句语句。
代码如下:
int* BinarySearch(int* arrayAddress, int arrayLength, int valueToSearch)
{
int head = 0;
int tail = arrayLength - 1;
int mid;
while (head < tail)
{
mid = (head + tail) / 2;
if (arrayAddress[mid] > valueToSearch)
{
_____(1)______
}
else
{
_____(2)______
}
}
if (tail < arrayLength && arrayAddress[tail] == valueToSearch)
{
return &arrayAddress[tail];
}
else
{
return NULL;
}
}
测试代码,如下
int main()
{
const int size = 8;
int arr[size] = { 6, 7, 8, 9, 10, 11, 12, 13 };
int* pi = BinarySearch(arr, size, 6);
if (pi != NULL)
{
cout << *pi << endl;
}
else
{
cout << "Not found!" << endl;
}
}
问了同学,有个答案,感觉不满意,如下
(1)tail = mid - 1;
(2)(arrayAddress[mid] == valueToSearch) ? (tail = head = mid) : (head = mid + 1);
哪位路过的高手有更好的答案,帮帮小弟吧! 二分查找 算法 c
[解决办法]
//就这么简单!!头每次加一,自己领悟吧!
tail=mid-1;
head+=1;
[解决办法]
我给的有问题。
题目中是对闭区间进行搜索,但是搜索的终止条件是区间只有一个元素。由于是向下取整,所以head = mid
可能导致死循环。
如果直接head = mid + 1会导致mid位置上满足条件的结果被忽略,所以对mid位置上的元素进行测试是必要的,如你在主贴中所说。对于填空题就只能这样了。
要避免死循环,就只有写成mid = (head + tail + 1) / 2了,这样的话是向上取整,mid永远不会和head等。
而tail可能是mid-1,这样就保证了进入下一次循环后搜索区间会减小,在1楼中的分析会保证正确性。