您的位置:首页 > 其它

二分查找注意点

2013-05-28 17:02 197 查看
二分查找的前提: 已序序列

正确算法:

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: