bsearch (二分法)

bsearch 使用二分法实现数组查找 数组必须是排序过的,可以考虑 qsort 快排


C语言中 bsearch 包含在<stdlib.h>头文件中,此函数可以根据你给的条件实现二分查找,如果找到元素则返回指向该元素的指针,否则返回NULL;对于有多个元素匹配成功的情况,bsearch()未定义返回哪一个。使用 bsearch 函数也要自己定义比较子函数


void *bsearch(const void *key, const void *base, size_t nmem, size_t size, int (*comp)(const void *, const void *))


key指向所要查找的元素,base指向进行查找的数组,nmem为查找长度,一般为数组长度,size为每个元素所占的字节数,一般用 sizeof(...)表示,comp指向比较子函数,它定义比较的规则。需要注意的是,数据必须是经过预先排序的,而排序的规则要和comp所指向比较子函数的规则相同。如果查找成功则返回数组中匹配元素的地址,反之则返回空。对于有多于一个的元素匹配成功的情况,bsearch()未定义返回哪一个


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

#define NUM 8

int compare(const void *p, const void *q)
{
return (*(int *)p - *(int *)q);
}

int main(int argc, char *argv[])
{
int array[NUM] = {9, 2, 7, 11, 3, 87, 34, 6};
int key = 3;
int *p;


qsort(array, NUM, sizeof(int), compare);
p = (int *)bsearch(&key, array, NUM, sizeof(int), compare);

(p == NULL) ? puts("not found") : puts("found");

return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
bsearch()函数是C语言中的标准库函数,用于在已排序的数组中查找特定元素。以下是一个bsearch()函数示例: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> int cmp(const void *a, const void *b) { return (*(int*)a - *(int*)b); } int main() { int arr[] = {5, 8, 10, 13, 17, 20}; int n = sizeof(arr) / sizeof(arr[0]); int key = 13; int *result = (int*) bsearch(&key, arr, n, sizeof(int), cmp); if (result != NULL) { printf("%d is found at position %d.\n", *result, result - arr + 1); } else { printf("%d is not found.\n", key); } return 0; } ``` 在这个示例中,我们定义了一个整数数组arr,长度为6。我们要在这个数组中查找元素13。我们使用bsearch()函数来查找元素。 首先,我们定义了一个名为cmp的函数,它将用于比较两个元素的值。这个函数将返回一个整数,如果第一个元素小于第二个元素,则返回负数。如果第一个元素等于第二个元素,则返回0。如果第一个元素大于第二个元素,则返回正数。这个函数将在bsearch()函数中使用。 接下来,我们定义了一个名为key的变量,它包含要查找的元素的值。然后,我们调用bsearch()函数来查找元素。在这里,我们传递了四个参数:要查找的元素的地址,数组的地址,数组的长度,元素的大小。最后一个参数是我们刚刚定义的cmp()函数的地址。 如果bsearch()函数找到了元素,它将返回一个指向该元素的指针。否则,它将返回NULL。在这个示例中,我们检查bsearch()函数的返回值是否为NULL。如果不是,则打印查找到的元素和它在数组中的位置。否则,打印未找到元素的消息。 输出结果为: ``` 13 is found at position 4. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值