使用改写二分查找的方式重写了lower_bound和upper_bound
#include <algorithm>
#include <cstdio>
#include <ctime>
using namespace std;
const int N = 55;
int a[N];
// search in a[first, last)
int my_binary_search(int first, int last, int v)
{
int mid;
--last;
while(first <= last) {
mid = (first + last) >> 1;
if(a[mid] == v) return mid;
else if(a[mid] > v) last = mid - 1;
else first = mid + 1;
}
return -1;
}
int my_lower_bound(int first, int last, int v)
{
int mid;
while(first < last) {
mid = (first + last) >> 1;
if(a[mid] < v) first = mid + 1; // 若中位数的值小于v的值,我们要在右边子序列中查找,
// 这时候pos可能是右边子序列的第一个
else last = mid; // 若中位数的值大于等于v,我们要在左边子序列查找,
// 但有可能mid处就是最终位置,所以我们不移动last,
} // 而是让first不断逼近last。
return first; // 和return last等效
}
int stl_lower_bound(int first, int last, int v)
{
int mid, half, len = last - first;
while(len > 0) {
half = len >> 1;
mid = first + half;
if(a[mid] < v) {
first = mid + 1;
len = len - half - 1; // 在右边子序列中查找
}
else len = half; // 在左边子序列(包含mid)中查找
}
return first;
}
int my_upper_bound(int first, int last, int v)
{
int mid;
while(first < last) {
mid = (first + last) >> 1;
if(a[mid] > v) last = mid; // 当中位数大于v时,last不动,让first不断逼近last
else first = mid + 1; // 当中位数小于等于v时,将first递增,并记录新的位置
}
return first; // 和return last等效
}
int stl_upper_bound(int first, int last, int v)
{
int mid, half, len = last - first;
while(len > 0){
half = len >> 1;
mid = first + half;
if(a[mid] > v) // 中位数大于v,在包含last的左半边序列中查找。
len = half;
else{
first = mid + 1; // 中位数小于等于v,在右半边序列中查找。
len = len - half - 1;
}
}
return first;
}
int main()
{
srand(time(0));
for(int i = 0; i < N; ++i)
a[i] = rand() % 200;
sort(a, a + N);
int a1, b1;
// for(int i = 0; i < 21; ++i) {
// printf("i : %d, value : %d\n", i, my_binary_search(0, 10, i));
// }
// for(int i = 0; i < 205; ++i) {
// printf("i : %d, v1 : %d, v2 : %d", i, a1 = my_lower_bound(0, N, i), b1 = lower_bound(a, a + N, i) - a);
// printf(", equal : %s\n", a1 == b1 ? "Yes" : "No");
// if(a1 != b1) break;
// }
for(int i = 0; i < 205; ++i) {
printf("i : %d, v1 : %d, v2 : %d", i, a1 = my_upper_bound(0, N, i), b1 = upper_bound(a, a + N, i) - a);
printf(", equal : %s\n", a1 == b1 ? "Yes" : "No");
if(a1 != b1) break;
}
return 0;
}