实现二进制搜索

时间:2012-10-28 19:14:59

标签: c++ algorithm binary-search

这是我的二元搜索:

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时。

我的实施有什么问题?

3 个答案:

答案 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;
    }
}