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.