二分查找总结

41 阅读1分钟

思路:

  1. 找到一个中间值mid,将所有小于mid的值放在其左边,将所有大于mid的值放在其右边
  2. 递归地进行重复第一步

代码模板: 总结来说有两个,根据区间判断

  1. 左闭右闭区间
  2. 左闭右开区间
// 左闭右闭区间
int Binary(int *nums, int numsSize, int val)
{
    int left = 0, right = numsSize - 1; // 包含右端点
    while (left <= right) // 可以为等号,因为左闭右闭区间有一个值也算,需要再一次比较
    {
        int mid = left + (right - left >> 1); // 左端点 + 区间长度一半
        if (nums[mid] > val)
            right = mid - 1;
        else if (nums[mid] < val)
            left = mid + 1;
        else
            return mid;
    }
    
    return -1;
}
// 左闭右开区间
int Binary(int *nums, int numsSize, int val)
{
    int left = 0, right = numsSize; // 不包含右端点
    while (left < right) // i == j时,只有一个元素,右端点不包含,所以不算一个区间
    {
        int mid = left + (right - left >> 1);
        if (nums[mid] > val)
            right = mid; // 重点:右端点不包含,上一轮没有比较过,需要将mid-1包含在区间里
        else if (nums[mid] < val)
        {
            left = mid + 1; 
        }
        else 
            return mid;
    }
    return -1;
}