在二分查找的程序实现中,如果left和right的更新不是取mid+1和mid-1而是都取mid,程序也是正确的吗

int BinarySearch(staticTable *Tbl; ElementType K)
{
   int left,right,mid,NoFound=-1;
   left=1;
   right=Tbl->Length;
   while (left<=right)
   {
    mid=(left+right)/2;
    if(K<Tbl->Element[mid])  right=mid-1;/* **可以变成right=mid;***/
    else if(K>Tbl->Element[mid]) left=mid+1;/* **可以变成left=mid;***/
    else return mid;
  }
  return NotFound;
}
阅读 7.1k
2 个回答

一种是:

int BinSearch(int target, int nums[]){
    int low = 0, high = nums.length - 1;
    while(low <= high){
        int mid = (low + high) / 2;
        if(nums[mid] == target)
            return mid;
        if(nums[mid] < target)
            low = mid + 1;
        else
            high = mid - 1;
    }
    return -1;
}

另一种:

int BinSearch(int target, int nums[]){
    int low = 0, high = nums.length;
    while(low < high){
        int mid = (low + high) / 2;
        if(nums[mid] == target)
            return mid;
        if(nums[mid] < target)
            low = mid + 1;
        else
            high = mid;
    }
    return -1;
}

可能会死循环,比如进入循环体的时候left为1,right为2,并且K >Tbl->Element[1]

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进