当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


C语言 bsearch用法及代码示例


C语言stdlib头文件(stdlib.h)中bsearch函数的用法及代码示例。

用法:

void* bsearch (const void* key, const void* base,
               size_t num, size_t size,
               int (*compar)(const void*,const void*));
数组中的二进制搜索
搜索给定key在由指向的数组中base(由num元素,每个size个字节),并返回一个void*指向匹配元素的指针(如果找到)。

为了执行搜索,该函数对进行了一系列调用comparkey作为第一个参数和数组所指向的元素base作为第二个论点。

由于可以优化此函数以使用非线性搜索算法(大概是二进制搜索),因此比较的元素少于key使用compar应该在比较比较相等的数据之前,而在比较比较较大的数据之前。任何以相同的条件排序的阵列都可以满足此要求compar(好像与qsort)。

参数

key
指向用作搜索关键字的对象的指针,type-casted指向void*
base
指向执行搜索的数组的第一个对象的指针,type-casted指向void*
num
指向的数组中的元素数base
size_t是无符号整数类型。
size
数组中每个元素的大小(以字节为单位)。
size_t是无符号整数类型。
compar
指向比较两个元素的函数的指针。
该函数被重复调用bsearch比较key针对中的个别元素base。它应遵循以下原型:
 
int compar (const void* pkey, const void* pelem);

以两个指针作为参数:第一个总是key,第二个指向数组的元素(两者均为type-castedconst void*)。该函数应返回(以稳定且可传递的方式):
返回值意义
<0指向的元素pkey在由指向的元素之前pelem
0指向的元素pkey等效于所指向的元素pelem
>0指向的元素pkey跟随由指向的元素pelem

对于可以使用常规关系运算符进行比较的类型,一般compar函数可能看起来像:

1
2
3
4
5
6
int compareMyType (const void * a, const void * b)
{
  if ( *(MyType*)a <  *(MyType*)b ) return -1;
  if ( *(MyType*)a == *(MyType*)b ) return 0;
  if ( *(MyType*)a >  *(MyType*)b ) return 1;
}


返回值

指向数组中与搜索匹配的条目的指针key。如果有多个匹配元素(即,compar会回来0),则可能指向其中任何一个(不一定是第一个)。
如果key找不到,则返回空指针。

示例

/* bsearch example */
#include <stdio.h>      /* printf */
#include <stdlib.h>     /* qsort, bsearch, NULL */

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

int values[] = { 50, 20, 60, 40, 10, 30 };

int main ()
{
  int * pItem;
  int key = 40;
  qsort (values, 6, sizeof (int), compareints);
  pItem = (int*) bsearch (&key, values, 6, sizeof (int), compareints);
  if (pItem!=NULL)
    printf ("%d is in the array.\n",*pItem);
  else
    printf ("%d is not in the array.\n",key);
  return 0;
}


在这个例子中compareints比较两个参数所指向的值,如下所示:int值,并返回减去其指向值的结果,从而得出0如果它们相等,则结果为正,如果所指向的值为正,则结果为正。a大于b或否定结果(如果由指向的值)b更伟大。

在主函数中,目标数组与qsort调用之前bsearch搜索值。

输出:
40 is in the array.

对于C字符串,strcmp可以直接用作compar争辩bsearch
/* bsearch example with strings */
#include <stdio.h>      /* printf */
#include <stdlib.h>     /* qsort, bsearch, NULL */
#include <string.h>     /* strcmp */

char strvalues[][20] = {"some","example","strings","here"};

int main ()
{
  char * pItem;
  char key[20] = "example";

  /* sort elements in array: */
  qsort (strvalues, 4, 20, (int(*)(const void*,const void*)) strcmp);

  /* search for the key: */
  pItem = (char*) bsearch (key, strvalues, 4, 20, (int(*)(const void*,const void*)) strcmp);

  if (pItem!=NULL)
    printf ("%s is in the array.\n",pItem);
  else
    printf ("%s is not in the array.\n",key);
  return 0;
}


输出:
example is in the array.




相关用法


注:本文由纯净天空筛选整理自C标准库大神的英文原创作品 C bsearch function。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。