qsort和bsearch

C语言中可以用bsearch()实现二分查找。同qsort()一样,bsearch()也包含在<stdlib.h>库中,且同样要自定义比较子函数。其原型如下:
 

 

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;
}

结果如下:

found

 

例openJugde 2804:

#include <stdio.h> #include <stdlib.h> #include <memory.h> #include <string.h> struct DIC { char str[11]; char ptr[11]; }; struct DIC dic[100005]; //qsort比较函数 int compare(const void *a,const void *b) { // puts((*(struct DIC*)a).ptr); return strcmp((*(struct DIC*)a).ptr,(*(struct DIC*)b).ptr); } //bsearch比较函数 int scompare(const void *a,const void*b){ return (strcmp((char*)a,(*(struct DIC*)b).ptr)); } int main(){ char s[30]; int n=0,i,j,k,temp; while(1){ gets(s); if(s[0]=='/0') break; for(i=0;s[i]!=' ';i++) dic[n].str[i]=s[i]; dic[n].str[i]='/0'; for(i=i+1,j=0;s[i]!='/0';i++){ dic[n].ptr[j++]=s[i]; } dic[n].ptr[j]='/0'; n++; } qsort(dic,n,sizeof(dic[0]),compare); while(scanf("%s",s)!=EOF){ DIC *p; p=(DIC*)bsearch(s,dic,n,sizeof(DIC),scompare); if(p==NULL){ printf("eh/n"); }else{ printf("%s/n",p->str); } } system("pause"); return 0; }

你可能感兴趣的:(c,struct,null,System,语言)