bsearch函数详解

一、bsearch函数

bsearch函数是在已排序的数组中查找指定元素的函数,是C语言标准库函数之一。它的原型如下:

void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

bsearch函数接收五个参数:

  1. key:指向要查找的元素的指针
  2. base:指向有序数组第一个元素的指针
  3. nmemb:数组中元素的个数
  4. size:每个元素的大小
  5. compar:用于比较两个元素大小的函数指针

二、bsearch函数返回什么

bsearch函数返回指向要查找的元素的指针,如果没有找到相应元素,则返回NULL指针。

三、bsearch用法

使用bsearch函数时,需要注意几个问题:

  1. 在使用bsearch函数查找某个元素之前,必须保证数组已经排序。否则,查找结果是不可预知的。
  2. 比较函数compar需要自己实现,需要根据数组里的元素类型写出相应的比较函数。一般情况下,比较函数需要返回一个整型值:
//比较两个整数的函数
int cmp_int(const void *a, const void *b){
    return (*(int*)a - *(int*)b);
}

四、bsearch研究

我们可以对bsearch函数做一些相关分析。假设有一个长度为n(n>=2)的排序数组,现在要在这个数组中找到一个指定的元素key,那么使用bsearch函数的时间复杂度为O(logn)。

接下来,我们来分析一下为什么bsearch函数的时间复杂度是O(logn)。假设在第k步时,已经剩下r个元素尚未检查,那么有:

  • 第1步时,r=n
  • 第2步时,r=n/2
  • 第3步时,r=n/4
  • 第4步时,r=n/8
  • 第k步时,r=n/2^k

当r=1时,也就是只有一个元素时,查找结束。所以,k=log2(n),时间复杂度为O(logn)。

五、bsearch函数c语言

接下来举一个代码例子,对于一个有序的整型数组,使用bsearch函数查找是否存在某个元素:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cmp_int(const void *a, const void *b);

int main(){
    int arr[] = {1, 3, 5, 7, 9};
    int key1 = 3, key2 = 4;
    int *result;
    result = (int*)bsearch(&key1, arr, 5, sizeof(int), cmp_int);
    if(result != NULL){
        printf("%d is found in arr\n", *result);
    }else{
        printf("%d is not found in arr\n", key1);
    }
    result = (int*)bsearch(&key2, arr, 5, sizeof(int), cmp_int);
    if(result != NULL){
        printf("%d is found in arr\n", *result);
    }else{
        printf("%d is not found in arr\n", key2);
    }
    return 0;
}

int cmp_int(const void *a, const void *b){
    return (*(int*)a - *(int*)b);
}

上面的代码中,首先定义了一个整型数组arr,然后使用bsearch函数查找元素2和4。由于数组arr是有序的,元素2并不存在于数组中,第一次查找结果为NULL,第二次查找结果是3,因为3是数组中的一个元素。

六、bsearch 巧妙

其实bsearch函数还可以用来查找满足某个条件的最大或最小的元素。例如,对于一个已经按照某个方式排序的整型数组,找到最后一个小于等于指定元素key的元素位置:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int cmp_int(const void *a, const void *b);

int main(){
    int arr[] = {1, 3, 5, 7, 9};
    int key = 6;
    int *result;
    result = (int*)bsearch(&key, arr, 5, sizeof(int), cmp_int);
    if(result == NULL){
        result = arr + 4;
    }
    printf("The last less than or equal to %d element is %d\n", key, *result);
    return 0;
}

int cmp_int(const void *a, const void *b){
    return (*(int*)a - *(int*)b);
}

代码中,当key不存在于数组arr中时,根据bsearch函数的返回值,最后一个小于等于key的元素位置是arr+4的位置。因此,第二个printf语句输出的结果是“The last less than or equal to 6 element is 5”。

类似地,如果需要查找满足某个条件的最小的元素位置,可以将比较函数更改为:int cmp_int_min(const void *a, const void *b) {return (*(int*)a – *(int*)b); }。

七、小结

本篇文章详细讲解了bsearch函数的定义、用法、时间复杂度及相关细节,以及一些巧妙的使用技巧。希望读者可以通过本文深入理解bsearch函数,灵活运用它来处理各种实际问题。

原创文章,作者:JOZVT,如若转载,请注明出处:https://www.506064.com/n/329725.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JOZVT的头像JOZVT
上一篇 2025-01-14 18:55
下一篇 2025-01-14 18:55

相关推荐

  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python中capitalize函数的使用

    在Python的字符串操作中,capitalize函数常常被用到,这个函数可以使字符串中的第一个单词首字母大写,其余字母小写。在本文中,我们将从以下几个方面对capitalize函…

    编程 2025-04-29
  • Python中set函数的作用

    Python中set函数是一个有用的数据类型,可以被用于许多编程场景中。在这篇文章中,我们将学习Python中set函数的多个方面,从而深入了解这个函数在Python中的用途。 一…

    编程 2025-04-29
  • 单片机打印函数

    单片机打印是指通过串口或并口将一些数据打印到终端设备上。在单片机应用中,打印非常重要。正确的打印数据可以让我们知道单片机运行的状态,方便我们进行调试;错误的打印数据可以帮助我们快速…

    编程 2025-04-29
  • 三角函数用英语怎么说

    三角函数,即三角比函数,是指在一个锐角三角形中某一角的对边、邻边之比。在数学中,三角函数包括正弦、余弦、正切等,它们在数学、物理、工程和计算机等领域都得到了广泛的应用。 一、正弦函…

    编程 2025-04-29
  • Python3定义函数参数类型

    Python是一门动态类型语言,不需要在定义变量时显示的指定变量类型,但是Python3中提供了函数参数类型的声明功能,在函数定义时明确定义参数类型。在函数的形参后面加上冒号(:)…

    编程 2025-04-29
  • Python定义函数判断奇偶数

    本文将从多个方面详细阐述Python定义函数判断奇偶数的方法,并提供完整的代码示例。 一、初步了解Python函数 在介绍Python如何定义函数判断奇偶数之前,我们先来了解一下P…

    编程 2025-04-29
  • Python实现计算阶乘的函数

    本文将介绍如何使用Python定义函数fact(n),计算n的阶乘。 一、什么是阶乘 阶乘指从1乘到指定数之间所有整数的乘积。如:5! = 5 * 4 * 3 * 2 * 1 = …

    编程 2025-04-29
  • 分段函数Python

    本文将从以下几个方面详细阐述Python中的分段函数,包括函数基本定义、调用示例、图像绘制、函数优化和应用实例。 一、函数基本定义 分段函数又称为条件函数,指一条直线段或曲线段,由…

    编程 2025-04-29
  • Python函数名称相同参数不同:多态

    Python是一门面向对象的编程语言,它强烈支持多态性 一、什么是多态多态是面向对象三大特性中的一种,它指的是:相同的函数名称可以有不同的实现方式。也就是说,不同的对象调用同名方法…

    编程 2025-04-29

发表回复

登录后才能评论