之前总是对二分的边界问题把握的不是很好,以致于出现死循环等问题。所以用这篇博文进行总结。
首先,本文所用算法均为左闭右闭的算法,且数组是以非递减顺序排列的。
1、查找是否存在关键值,如有相等的,则返回最左边的那个值的位置。否则,返回-1.
int binary_search_1(int a[], int n, int key)
{
int m, l = 0, r = n - 1;//闭区间[0, n - 1]
while (l < r)
{
m = l + ((r - l) / 2);//向下取整
if (a[m] < key)
l = m + 1;
else
r = m;
}
if (a[r] == key) return r;
return -1;
}
2、查找是否存在关键值,如有相等的,则返回最右边那个值得位置。否则,返回-1.
int binary_search_2(int a[], int n, int key)
{
int m, l = 0, r = n - 1;//闭区间[