//二分查找:在包含size个元素、从小到大排序的int数组array里查找元素p,如果找到返回下标,如果未找到返回-1
int BinarySearch(int array[], int size, int p)
{
int left = 0;//查找区间的左端点
int right = size - 1;//查找区间的右端点
while (left <= right)//如果查找区间不为空,继续查找
{
int mid = left + (right - left) / 2;//当下标不为整数时,向下取整
if (p == array[mid])
return mid;
else if (p > array[mid])
left = mid + 1;//设置新的查找区间的左端点
else
{
right = mid - 1;//设置新的查找区间的右端点
}
}
return -1;
}
//注意:int mid=(L+R)/2;//取查找区间正中元素的下标
//为防止(L+R)过大溢出,int mid=L+(R-L)/2
//在包含size个元素的、从小到大排序的int数组a里查找比给定整数p小的,下标最大的元素。找到则返回下标,找不到返回-1
int LowerBound(int a[], int size, int p)
{
int left = 0;//查找区间的左端点
int right = size - 1;//查找区间的右端点
int lastPosition = -1;//到目前为止找到的最优解
while (left <= right)//如果查找区间不为空就继续查找
{
int mid = left + (right - left) / 2;//查找区间正中元素的下标
if (a[mid] >= p)
right = mid - 1;
else
{
lastPosition = mid;
left = mid + 1;
}
}
return lastPosition;
}