前言
二分查找的思想比较简单,主要是对其细节的处理
一、二分查找需要注意的两个主要细节
1.while 中的循环条件:left < right 还是 left <= right
2.对于右侧边界的处理:right = middle 还是 right =middle-1
对于以上细节的区分处理主要取决于查找区间的形式:左闭右闭区间 还是 左闭右开区间
二、分情况分析
1.左闭右闭区间,查找区间为[left,right]
代码如下(示例):
int BinSearch(int nums[], int size, int target)
{
int left, right, middle;
left=0;
right=size-1;
while(left <= right)
{
middle=(left+(right-left)/2); //避免直接使用middle=(right+left)/2造成溢出
if(nums[middle] < target)
{
left = middle+1; //left的取值是固定的
}
else if(nums[middle] > target)
{
right = middle-1; //闭区间里能取到边界,middle显然不是target,则用middle-1作右界
}
else if(nums[middle] == target)
{
return 1;
}
}
return 0;
}
2.左闭右开区间,查找区间为[left,right)
代码示例如下
int BinSearch(int nums[], int size, int target)
{
int left, right, middle;
left=0;
right=size;
while(left < right) //半开区间里取不到右边界
{
middle=(left+(right-left)/2); //避免直接使用middle=(right+left)/2造成溢出
if(nums[middle] < target)
{
left = middle+1; //left的取值是固定的
}
else if(nums[middle] > target)
{
right = middle; //半开区间里不能取到右边界,middle显然不是target,则可以用middle作右界
}
else if(nums[middle] == target)
{
return 1;
}
}
return 0;
}
总结
二分查找的思想是比较简单的,主要要注意的是根据不同的取值区间对其细节的处理。