1. 基本介绍
STL 中关于二分查找的函数有三个lower_bound()
、upper_bound()
、binary_search()
。这三个函数都运用于有序区间(二分查找的前提),下面是其中两个:
- lower_bound():返回被查序列中第一个大于等于查找值的指针。
- upper_bound():返回被查序列中第一个大于查找值的指针;
图解:
2. 代码举例
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[10] = { 1,3,5,56,98 };
int low = lower_bound(a, a + 5, 5) - a;
int up = upper_bound(a, a + 5, 5) - a;
cout << "第一个大于等于5的位置是" << low << endl; // 2
cout << "第一个大于5的位置是" << up << endl; // 3
return 0;
}
3. lower_bound() 源码
// 这个算法中,first是最终要返回的位置
int lower_bound(int *array, int size, int key)
{
int first = 0, middle;
int half, len;
len = size;
while(len > 0)
{
half = len >> 1;
middle = first + half;
if(array[middle] < key)
{
first = middle + 1;
len = len - half - 1; // 在右边子序列中查找
}
else
{
len = half; // 在左边子序列(包含middle)中查找
}
}
return first;
}
4. upper_bound() 源码
int upper_bound(int *array, int size, int key)
{
int len = size - 1;
int half, middle;
while(len > 0)
{
half = len >> 1;
middle = first + half;
if(array[middle] > key) // 中位数大于key,在包含last的左半边序列中查找。
{
len = half;
}
else
{
first = middle + 1; // 中位数小于等于key,在右半边序列中查找。
len = len - half - 1;
}
}
return first;
}