首页 > 其他分享 >binary-search

binary-search

时间:2023-03-08 22:56:49浏览次数:37  
标签:binary search right int middle 数组 array left

二分查找分为3个流程:

  • 一开始,范围覆盖整个数组。
  • 将数组的中间项与T进行比较,如果T比数组的中间项要小,则到数组的前半部分继续查找,反之,则到数组的后半部分继续查找。
  • 如此,每次查找可以排除一半元素,范围缩小一半。就这样反复比较,反复缩小范围,最终就会在数组中找到T,或者确定原以为T所在的范围实际为空。

具体实现:

int BinarySearch(int array[], int n, int value)
{
    int left = 0;
    int right = n - 1;
    //如果这里是int right = n 的话,那么下面有两处地方需要修改,以保证一一对应:
    //1、下面循环的条件则是while(left < right)
    //2、循环内当 array[middle] > value 的时候,right = mid

    while (left <= right)  //循环条件,适时而变
    {
        int middle = left + ((right - left) >> 1);  //防止溢出,移位也更高效。同时,每次循环都需要更新。

        if (array[middle] > value)
        {
            right = middle - 1;  //right赋值,适时而变
        }
        else if(array[middle] < value)
        {
            left = middle + 1;
        }
        else
            return middle;
        //可能会有读者认为刚开始时就要判断相等,但毕竟数组中不相等的情况更多
        //如果每次循环都判断一下是否相等,将耗费时间
    }
    return -1;
}

注意:

  • 如果令 left <= right,则right = middle - 1;
  • 如果令left < right,则 right = middle;

即算法所操作的区间,是左闭右开区间,还是左闭右闭区间,这个区间,需要在循环初始化。且在循环体是否终止的判断中,以及每次修改left, right区间值这三个地方保持一致,否则就可能出错。

标签:binary,search,right,int,middle,数组,array,left
From: https://www.cnblogs.com/9817345hjbvb/p/17196572.html

相关文章