需要注意的一个地方:middle=start+(end-start)/2;//假如,left与right之和超过了所在类型的表示范围的话,那么middle就不会得到正确的值.所以写成这种形式稳妥
另外一个需要注意的地方就是,二分搜索只能够用于搜索排序了的数组,如果数组没有排序那么下面的方法就不起作用了。而且要是要用下面的两个程序,数组还需要默认的采用的是从小到大的排序方式。
#include<iostream>
using namespace std;bool IsInvalidInput=false;
int BinarySearch(int *data,int length,int start,int end,int k)//二分查找,data必须是一个排序的数组。在这里默认data是按照升序排序的数组
{
if(data==NULL||length<0||start<0||end<0||start>end)
{
IsInvalidInput=true;
return -1;
}
while(start<=end)
{
int middle=start+(end-start)/2;//假如,left与right之和超过了所在类型的表示范围的话,那么middle就不会得到正确的值.所以写成这种形式稳妥
if(data[middle]<k)
start=middle+1; //一定注意start千万不能置为middle。如果这里把start,end设置middle很可能就会导致死循环
else if(data[middle]>k)
end=middle-1;//注意end千万不能置为middle
else
return middle;
}
return -1;
}
int BinarySearch_recurse(int *data,int length,int start,int end,int k) //递归实现二分查找(折半搜索)
{
if(data==NULL||length<0)
{
IsInvalidInput=true;
return -1;
}
if(start<=end)
{
int middle=start+(end-start)/2;