bsearch 함수

void *bsearch(const void *key, const void *base,size_t nmemb, size_t size,int (*compare)const void *, const

void *)); 이진 탐색

입력 매개 변수 리스트

key 검색할 키

base 정렬 상태의 메모리 주소

nmemb 원소 개수

compare 비교 논리

반환 값

검색할 키가 있는 메모리 주소, 없을 때 NULL

bsearch 함수는 정렬 상태의 배열에서 이진 탐색으로 빠른 검색 기능을 제공합니다. 마지막 인자는 두 개의 원소를 비교할 수 있는 알고리즘을 전달받습니다. 따라서 bsearch 함수를 사용하려면 비교하는 함수는 사용하는 곳에서 정의하여 전달해야 합니다. 비교하는 함수는 앞쪽이 클 때 양수, 같을 때 0, 뒤쪽이 클 때 음수를 반환하게 정의합니다.

사용 예

//C언어 표준 라이브러리 함수 가이드
//void* bsearch (const void* key, const void* base,size_t num, size_t size, int (*compare)(const void*,const void*)); 이진 탐색 함수
//정렬 상태의 배열에서 검색

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef int (*compare)(const void*,const void*); //비교 알고리즘의 함수 포인터 형식을 compare로 타입명 정의
int compare_int (const void * a, const void * b) //두 개의 정수를 비교하는 알고리즘(입력 인자로 정수가 있는 메모리 주소를 전달해야 함)
{
    const int *p1 = (const int *)a;
    const int *p2 = (const int *)b;
    return *p1 -*p2;
}

int compare_str(const void *a,const void *b) //두 개의 문자열을 비교하는 알고리즘(입력 인자로 문자열 주소를 전달해야 함)
{
    const char *p1 = (const char *)a;
    const char *p2 = (const char *)b;
    return strcmp(p1,p2);
}
typedef char strelem[20];//원소 형식이 char이고 크기가 20인 배열 형식을 strelem 으로 타입명 정의

int main (void)
{
    int arr[10]= {1, 10 , 15, 20, 29, 30, 31, 33, 35, 50 };//정렬 상태
    strelem arr2[5]= {"강감찬","김구","을지문덕","이순신","홍길동"};//정렬 상태
    int *pos;
    strelem *pos2;
    int key =29;

    pos = (int*)bsearch (&key, arr, 10, sizeof(int), compare_int);//이진 탐색
    if(pos!=NULL)
    {
        printf ("%d is in the array %d index.\n",*pos, pos-arr);//탐색 키와 인덱스 출력
    }
    else
    {
        printf ("%d is not in the array.\n",key);
    }
    pos2 = (strelem *) bsearch ("이순신", arr2, 5, sizeof(strelem),compare_str);//이진 탐색
    if(pos2!=NULL)
    {
        printf ("%s is in the array %d index.\n",pos2, pos2-arr2);//탐색 키와 인덱스 출력
    }
    else
    {
        printf ("%d is not in the array.\n","이순신");
    }
    return 0;
}

출력

29 is in the array 4 index.
이순신 is in the array 3 index.