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