思路:
- 找到一个中间值mid,将所有小于mid的值放在其左边,将所有大于mid的值放在其右边
- 递归地进行重复第一步
代码模板: 总结来说有两个,根据区间判断
- 左闭右闭区间
- 左闭右开区间
// 左闭右闭区间
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;
}