二分搜索需要注意开闭区间的问题,限制条件和边界要保持配对:left<=right, left = left +1 right = right -1.
扩展1:对于循环有序的数组,它是循环递增的,例如:A[]={ 17 19 20 25 1 4 7 9},也可以使用二分搜索:每次将数组分为2部分,一个是单调递增的,一个是循环递增的。如果是单调递增的话直接使用朴素的二分搜索,如果是循环递增的话继续使用特殊二分搜索下去。
int rotateBinerySearch(int *A, int value,int begin, int end)
{
int mid; = begin + (end - begin)/2;
while(begin<end)
{
mid = begin + (end - begin)/2;
if(A[mid]==value)
return mid;
else
{
if(A[mid]>=A[begin]) //数组的前半部分是正常递增数组
{
if(value<A[mid]) //正常结构
end = mid - 1;
else
begin = mid + 1;
}
else //数组的后半部分是正常递增的数组
{
if(A[mid]<value)
begin = mid + 1;
else
end = mid - 1;
}
}
}
}