언어 자료구조 알고리즘/C11 표준 라이브러리 함수

bsearch 함수 [C언어 표준 라이브러리 함수 가이드]

언제나휴일 2016. 1. 3. 15:48
반응형

bsearch


헤더 파일

[언어 자료구조 알고리즘/C11 표준 라이브러리 함수] - stdlib.h

 

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.

 


사용한 함수

[언어 자료구조 알고리즘/C11 표준 라이브러리 함수] - printf

반응형