我们都已经很清楚普通的二分查找算法的写法:
1. 处理无效输入的时候
bool isInvalidInput=false;//可以用作信号量处理
int BinarySerach(int array[],int n,int key){
if(array==NULL||n<0){ //边界处理
isInvalidInput==true;
return -1;
}
isInvalidInput=false; //区分-1表示的意思是无效输入还是没找到
int left,right,middle;
left=0,right=n-1;
while(left<=right){
middle=left+(right-left)/2; //防止溢出
if(array[middle]<key)
left=middle+1;
else if(array[middle]>key)
right=middle-1;
else
return middle;
}
return -1; //没找到返回-1
}
上面这种是最普通的二分查找算法,但是我们可以进一步优化,针对每次循环需要比较两次,而且如果存在相同的数,返回的也不是第一次出现的位置,优化后的代码:
2.针对上述两个问题进行优化后
bool isInvalidInput=false;
int BinarySerach(int array[],int n,int key){
if(array==NULL||n<0){ //边界处理
isInvalidInput==true;
return -1;
}
isInvalidInput=false;
int left,right,middle;
left=-1,right=n; //这里不一样了,
while(left+1 != right){ //判断条件是最后left和right相差1,这种情况与上面的差别是,找到后不会立即返回,而是找到第一次出现的位置
middle=left+(right-left)/2; //防止溢出
if(array[middle]<key)
left=middle;
else //找到后接着寻找第一次出现的位置
right=middle;
}
if(right>=n||array[right]!=key){
return -1; //没找到返回-1
}
return right;
}