binary_search,lower_bound, upper_bound的实现和c++调库

自己实现


#include <bits/stdc++.h>
using namespace std;
// 在数组里面查找值为val的索引,如果有多个值为val,随即返回一个索引;如果没有返回-1.
int binary_search(int *a, int n, int val)
{
    int left = 0, right = n, mid;
    while(left < right)
    {
        mid = (left+right)/2;   // 更严谨的写法是 mid=(right-left)/2+left;
        if(a[mid] == val) return mid;
        if(a[mid] < val) left=mid+1;
        if(a[mid] > val) right=mid;
    }
    return -1;
}

// 在数组里面查找值为val的索引,如果有多个值为val,随即最小的索引;如果没有返回-1.
int lower_bound(int *a, int n, int val)
{
    int left = 0, right = n, mid;
    while(left < right)
    {
        mid = (left+right)/2;
        if(a[mid]>=val) right=mid;
        else left=mid+1;
    }
    if(a[left]!=val) return -1;
    return left;
}

// 在数组里面查找值为val的索引,如果有多个值为val,随即最大的索引;如果没有返回-1.
int upper_bound(int *a, int n, int val)
{
    int left = 0, right = n, mid;
    while(left < right)
    {
        mid = (left+right)/2;
        if(a[mid]<=val) left=mid+1;
        else right=mid;
    }
    if(a[left]!=val) return -1;
    return left;
}

int main()
{
    int a[] = {1, 2, 2, 3, 3, 3, 4, 4, 7, 7};
    int index1 = binary_search(a, 10, 3); // 4
    int index2 = lower_bound(a, 10, 0);   // 3
    int index3 = upper_bound(a, 10, 0);   // 5
    cout << index1 << endl << index2 << endl << index3 << endl;
    return 0;
}

c++调库

/*
lower_bound(起始地址,结束地址,要查找的数值) 返回的是数值 第一个 出现的位置。

upper_bound(起始地址,结束地址,要查找的数值) 返回的是数值 大于最后一个 出现的位置。

binary_search(起始地址,结束地址,要查找的数值)  返回的是是否存在这么一个数,是一个bool值。
 */
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int a[] = {1, 2, 2, 4, 5, 5, 5, 9};
    int index1 = lower_bound(a, a+8, 5)-a; // 4
    int index2 = upper_bound(a, a+8, 5)-a; // 7 注意!!!回的是数值 大于最后一个 出现的位置。
    bool index3 = binary_search(a, a+8, 5); // 1
    cout << index1 << endl;
    cout << index2 << endl;
    cout << index3 << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40438165/article/details/83443400