您的位置:首页 > 职场人生

骇人听闻的二分查找(某公司校园招聘笔试试题)(据说只有10%的程序员可以写出没有bug的二分查找)

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

 

错误程序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;
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;
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: