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/zh-hk/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

發表回復

登錄後才能評論