90%以上的程序员无法正确无误的写出二分查找代码。- Jon Bentley
很久没写二分查找的代码,刚才很不幸发现我是上述中的90%以上的程序员里的一员。有几个要注意的点:
1. 先搞清楚要查找的区间范围,这个很重要。
2. mid = low + ((high - low) >> 1)
可防止溢出。
贴一下自己写的二分查找代码,警醒下:
#include <iostream>
using namespace std;
int binarySearch1(int a[], int x, int low, int high)
{
int mid;
while (low < high) {
mid = low + ((high - low) >> 1);
if (x < a[mid]) {
high = mid;
} else if (x > a[mid]) {
low = mid + 1;
} else
return mid;
}
return -1;
}
int binarySearch2(int a[], int x, int low, int high)
{
int mid;
while (low <= high) {
mid = low + ((high - low) >> 1);
if (x < a[mid])
high = mid - 1;
else if (x > a[mid])
low = mid + 1;
else
return mid;
}
return -1;
}
int main()
{
int a[] = {1,2,3,4,6,8,10};
cout << binarySearch1(a, 4, 0, 7) << endl;
cout << binarySearch2(a, 4, 0, 6) << endl;
return 0;
}
假设数组下标范围为0~n-1
。
对于binarySearch1
而言,查找失败时low=high
。对于binarySearch2
而言,查找失败时low=high+1
。
此时low
为0~n
之间的某个值。