1、首先二分查找判断元素是否存在,存在返回其位置,不存在返回-1.代码如下:
int bsearchWithoutRecursion(int array[], int low, int high, int target)
{
while(low <= high)
{
int mid = (low + high)/2;
if (array[mid] > target)
high = mid - 1;
else if (array[mid] < target)
low = mid + 1;
else //find the target
return mid;
}
//the array does not contain the target
return -1;
<pre name="code" class="cpp">
2、
1)二分法寻上界:
//Find the fisrt element, whose value is larger than target, in a sorted array
int BSearchUpperBound(int array[], int low, int high, int target)
{
//Array is empty or target is larger than any every element in array
if(low > high || target >= array[high]) return -1;
int mid = (low + high) / 2;
while (high > low)
{
if (array[mid] > target)
high = mid;
else
low = mid + 1;
mid = (low + high) / 2;
}
return mid;
}
2)二分法寻下界:
//Find the last element, whose value is less than target, in a sorted array
int BSearchLowerBound(int array[], int low, int high, int target)
{
//Array is empty or target is less than any every element in array
if(high < low || target <= array[low]) return -1;
int mid = (low + high + 1) / 2; //make mid lean to large side
while (low < high)
{
if (array[mid] < target)
low = mid;
else
high = mid - 1;
mid = (low + high + 1) / 2;
}
return mid;
}
2、若要寻找严格的上下界,则把上面的大小判断修改即可:换成大于等于和小于等于。
去掉判断数组边界的等号:
target >= array[high]改为 target > array[high]
在与中间值的比较中加上等号:
array[mid] > target改为array[mid] >= target