링크텍스트 이 링크는 이진검색의 자세한 검색과정이 있습니다. 검색과정을 이해하고 이 글을 봐주셔야 이해가 수월합니다.
bsearch 함수와 같은 형식으로 호출할 수 있는 함수를 구현해봅시다.
아래의 binsearch 함수는 bsearch와 동일한 함수입니다.
아래는 오름차순으로 정렬된 배열을 이진검색을 통해 키값을 찾아내는 알고리즘입니다. 전체적으로 코드를 살펴본 후 bsearch(binsearch) 함수를 자세히 알아봅시다.
/* bsearch 함수를 사용하여 오름차순으로 정렬된 배열을 검색 */
#pragma warning (disable:4996)
#include <stdio.h>
#include <stdlib.h>
//*--- 정수를 비교하는 함수(오름차순) ---*/
int int_cmp(const int* a, const int* b)
{
if (*a < *b)
return -1;
else if (*a > * b)
return 1;
else
return 0;
}
void* binsearch(const void* key, const void* base, size_t nmemb, size_t size, int(*compar)(const void*, const void*))
{
size_t pl = 0; // 검색 범위 맨앞 인덱스
size_t pr = nmemb; // 검색 범위 맨뒤 인덱스
size_t pc; // 중앙 요소 인덱스
char* x = (char*)base;
if(nmemb > 0) {
while (1) {
int comp = compar(&x[(pc = (pl + pr) / 2) * size], key);
if (comp == 0) // 검색 성공
return &x[pc * size];
else if (pl == pr) // 검색 범위의 맨앞 인덱스가 맨뒤 인덱스를 넘지 않을때 반복
break;
else if (comp < 0) // 검색 범위를 뒤쪽 반으로 줄임
pl = pc + 1;
else
pr = pc - 1; // 검색 범위를 앞쪽 반으로 줄임
}
}
return NULL; // 검색 실패
}
int main(void)
{
int i, nx, ky;
int* x = NULL; /* 배열의 첫 번째 요소에 대한 포인터 */
int* p = NULL; /* 검색한 요소에 대한 포인터 */
puts("bsearch 함수를 사용하여 검색");
printf("요소의 개수 : ");
scanf("%d", &nx);
x = (int*)calloc(nx, sizeof(int)); /* 요소의 개수 nx인 int형 배열을 생성 */
printf("오름차순으로 입력하세요.\n");
printf("x[0] : ");
scanf("%d", &x[0]);
for (i = 1; i < nx; i++) {
do {
printf("x[%d] : ", i);
scanf("%d", &x[i]);
} while (x[i] < x[i - 1]); /* 바로 앞의 값보다 작으면 다시 입력 */
}
printf("검색 값 : ");
scanf("%d", &ky);
p = (int*)binsearch(&ky, /* 검색 값에 대한 포인터 */
x, /* 배열 */
nx, /* 요소의 개수 */
sizeof(int), /* 요소의 크기 */
(int(*)(const void*, const void*)) int_cmp /* 비교 함수 */
);
if (p == NULL)
puts("검색에 실패했습니다.");
else
printf("%d는 x[%d]에 있습니다.\n", ky, (int)(p - x));
free(x); /* 배열을 해제 */
return 0;
}
메인함수 int *x
binsearch함수 char *x
char *x = (char*)base;
void 포인터형으로 받은 매개변수 base를 char 포인터로 자료형 변환
int comp = compar(&x[(pc = (pl + pr) / 2) * size], key);