这是我的二元搜索:
int binarySearch(int arr[], int value, int min, int max){
int pos = -1;
while (max >= min && pos == -1) {
int mid = (max+min)/2;
if(arr[mid] == value){
pos = mid;
}else if(arr[mid] < value){
min = mid +1;
}else if(arr[mid] > value){
max = mid -1;
}
}
return pos;
}
我这样称呼它:
//Arr contain values 0-63
int i = binarySearch(arr, 64, 0, 64);
这些是中间值
32 48 56 60 62 63 64
在最后一次检查时,我尝试访问位于64位的元素,当数组中的最后一个位置为63时。
我的实施有什么问题?
答案 0 :(得分:3)
您的数组包含0-63之间的值(如您所述),并且您为min和max提供以下值:min = 0,max = 64。并更改以下行,以便您的代码可以处理高int值,否则可能会出现内存溢出。
int mid = min+(max-min)/2;
上述公式简化为(max + min)/ 2本身但保护整数溢出。
答案 1 :(得分:0)
当max == min时,你的长度是0,所以你不应该进入循环。如果你的高水位是“一个接一个的结束”(并且你的高水应该是“一个接一个的结束”,这是一个非常有用的模式),条件变为(max > min && ...)
{/ 1>}
哦,并将其设为max = mid
而不是max = mid-1
,因为max代表“超越结束”,而不是最后一个元素。
作为一种通用的编码风格改进,在执行此类代码时,会在索引处于范围内的地方断言。这不仅可以提前发现问题,还可以帮助您推断出哪些值在边界内,哪些不是...
答案 2 :(得分:0)
试试此代码
while (max > min && pos == -1) {
int mid = (max+min)/2;
if(arr[mid] == value){
pos = mid;
}else if(arr[mid] < value){
min = mid;
}else if(arr[mid] > value){
max = mid;
}
}