#include <iostream>
using namespace std;
template <typename T>
size_t find_lower_bound(size_t i, size_t j, T* data, const T& key, bool (*les)(const T&, const T&)) {
if (les(key, data[i])) {
return i;
}
while (i < j) {
size_t mid = i + (j-i)/2;
if (les(data[mid], key)) {
i = mid + 1;
} else {
j = mid;
}
}
return i;
}
bool les(const int& v1, const int& v2) {
return v1 < v2;
}
void test(){
int a [] = {1,4,4,4,4,6,100};
int num = sizeof(a)/sizeof(int);
int key = 20;
size_t pos = find_lower_bound(0, num-1, a, key, les);
cout << "to find " << key << " pos:" << pos << " result:" << a[pos] << endl;
}
int main()
{
test();
return 0;
}
第二种实现:
size_t binary_lower_bound(const void* array,
size_t count,
size_t unit_size,
const void* key,
bool(*less)(const void*, const void*)) {
const char* start = (const char*)array;
if (count == 0 || !less(key, start)) {
return 0;
}
while (count > 0) {
int step = count / 2;
const char* val = start + unit_size * step;
if (less(val, key)) {
start = val + step;
count -= (step + 1);
}else {
count = step;
}
}
}