一、bsearch函數
bsearch函數是在已排序的數組中查找指定元素的函數,是C語言標準庫函數之一。它的原型如下:
void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
bsearch函數接收五個參數:
- key:指向要查找的元素的指針
- base:指向有序數組第一個元素的指針
- nmemb:數組中元素的個數
- size:每個元素的大小
- compar:用於比較兩個元素大小的函數指針
二、bsearch函數返回什麼
bsearch函數返回指向要查找的元素的指針,如果沒有找到相應元素,則返回NULL指針。
三、bsearch用法
使用bsearch函數時,需要注意幾個問題:
- 在使用bsearch函數查找某個元素之前,必須保證數組已經排序。否則,查找結果是不可預知的。
- 比較函數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-tw/n/329725.html