// <cstdlib> 
void* bsearch (const void* key, const void* base,
               size_t num, size_t size,
​               int (*compar)(const void*,const void*));

二分(Binary)查找。

如果您使用 C++ 编程,推荐参考 std::binary_search

  • key

    指向被搜索对象的指针,且被转换成 void*

    base

    指向被排序数组中第一个对象的指针,且被转换成 void*

    num

    数组中元素的个数。

    size

    数组中各个元素的字节大小。

    compare

    函数指针,其指向的函数用于比较两个元素。

    该函数会被 bsearch 重复调用。它须遵守以下原型:

    int compare(const void* p1, const void* p2);

    该函数返回一个整数,代表如下含义:

    当返回值 < 0 时,表示 p1 指向的元素在 p2 指向的元素前面。

    当返回值为 0 时,表示 p1 指向的元素与 p2 指向的元素等价。

    当返回值 > 0 时,表示 p1 指向的元素在 p2 指向的元素后面。

  • 返回一个指针,其指向数组中等价于 key 所指向对象的对象。

    如果不止一个匹配对象,将会返回其中的任意一个(而不一定是第一个匹配对象)。

    如果 key 未找到,则返回空指针。

  • 例 1

    #include <iostream>
    #include <cstdlib>
    
    int MyCompare(const void* m, const void* n) {
        return (*(int*)m - *(int*)n);
    }
    void BSearch_1() {
        // 构造一个 vector 对象
        int foo[] = { 8, 23, -5, 7, 29, 0, 7, 7, -7, 1, -1 };
        int count = sizeof(foo) / sizeof(foo[0]);
        // 调用 bsearch 前必须已经排过序
        std::qsort(
            foo,
            count,
            sizeof(foo[0]),
            MyCompare);
        for (int i = 0; i < count; i++){
            std::cout << foo[i] << " ";
        }
        std::cout << std::endl;
    
        // 用二分法查找值为 8 的元素
        int key = 8;
        void * p = std::bsearch(
            &key,
            foo,
            count,
            sizeof(foo[0]),
            MyCompare);
        if (p)
            std::cout << *(int*)p << std::endl;
    }
    int main()
    {
        BSearch_1();
        return 0;
    }

    -7 -5 -1 0 1 7 7 7 8 23 29
    8

  • 暂无,欢迎编辑。共同维护,打造精品。