二分查找都熟悉吧,先写一个有bug的二分查找
static int binary(int *arr, int len, int data)
{
int min = 0;
int max = len - 1;
int mid = 0;
while(min <= max)
{
mid = (min + max) / 2;
if(arr[mid] > data)
max = mid - 1;
else if(arr[mid] < data)
min = mid + 1;
else
return mid;
}
return -1;
}
mid = (min + max) / 2; 这句中 存在一个隐藏的bug,看上去这句话没问题,当min 和 max很大的时候可能会导致数组访问出错 int类型溢出,找的值在数组左端的时候就可能会出现问题。
下边是修改过后的代码 mid = min + ((max - min) >> 1);
static int binary1(int *arr, int len, int data)
{
int min = 0;
int max = len - 1;
int mid = 0;
while(min <= max)
{
// mid = min + (max - min) / 2;
mid = min + ((max - min) >> 1);
if(arr[mid] > data)
max = mid - 1;
else if(arr[mid] < data)
min = mid + 1;
else
return mid;
}
return -1;
}