二分查找的前提: 已序序列
正确算法:
int binary_sort(int arr[], int length, int value)
{
if(arr == NULL || length == 0)
return -1;
int ret = -1;
int left = 0;
int right = length-1;
while(left <= right)
{
int mid = left + (right-left)/2;
if(value > arr[mid])
{
left = mid + 1;
}
else if(value < arr[mid])
{
right = mid -1;
}
else
{
ret = mid;
break;
}
}
return ret;
}
错误点1:
循环区间是[left, right)
但是每次调整去见识mid+1或者mid-1的值会被丢失
例如: 1,3,5,7,9 ,用下面算法查找3 会返回没有找到
while(left < right)
{
int mid = left + (right-left)/2;
if(value > arr[mid])
{
left = mid + 1;
}
else if(value < arr[mid])
{
right = mid -1;
}
else
{
ret = mid;
break;
}
}
错误点2:
如果查找的value不存在array中,会导致死循环,因为区间缩小到最中间2个位置,就无法继续缩小了,永远无法退出,
例如1,3,5,7,9 中查找2 导致死孙桓
while(left <= right)
{
int mid = left + (right-left)/2;
if(value > arr[mid])
{
left = mid;
}
else if(value < arr[mid])
{
right = mid;
}
else
{
ret = mid;
break;
}
}
错误点3:
如果2个数组位数很大,可能导致溢出
while(left <= right)
{
int mid = (left + right)/2;
if(value > arr[mid])
{
left = mid;
}
else if(value < arr[mid])
{
right = mid;
}
else
{
ret = mid;
break;
}
}