Page 118 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 118
p = bsearch(&ky, /* 검색값에 대한 포인터 */
37 p = bsearch(&ky, /* 검색값에 대한 포인터 */
x, /* 배열 */
38 x, /* 배열 */
39 nx, /* 요소의 개수 */
nx, /* 요소의 개수 */
40 sizeof(int), /* 요소의 크기 */
sizeof(int), /* 요소의 크기 */
(int(*)(const void *, const void *)) int_cmp /* 비교 함수 */
41 (int(*)(const void *, const void *)) int_cmp /* 비교 함수 */
);
42 );
43 if(p == NULL)
44 puts("검색에 실패했습니다.");
45 else
46 printf("%d은(는) x[%d]에 있습니다.\n", ky, (int)(p - x));
47 free(x); /* 배열을 해제 */
48
49 return 0;
50 }
비교 함수
이번에는 앞에서 가장 복잡하다고 말했던 함수의 포인터형인 다섯 번째 인수에 대해 살펴보
겠습니다(보충수업 3-3에서 조금 더 자세히 설명합니다). 이진 검색의 검색 과정에는 검색하는 키
값과 배열의 요솟값을 비교하여 대소 관계를 판단하는 과정이 포함됩니다. 그런데 대소 관계
를 판단하는 방법은 요소의 자료형마다 다릅니다. 요소의 자료형은 정수일 수도 있고 문자열
이나 구조체일 수도 있습니다. 그러므로 두 값을 비교하고 난 다음의 어떤 값을 반환하는 비
교 함수는 사용자가 직접 작성해야 합니다. 따라서 bsearch 함수는 다섯 번째 매개변수로 이
비교 함수에 대한 포인터를 전달하는 방식을 취하고 있습니다. 다음은 실습 3-5에서 구현한
bsearch 함수의 반환값에 대한 설명입니다.
1. 첫 번째 인수가 가리키는 값이 더 작으면 음수 값을 반환합니다.
2. 첫 번째 인수가 가리키는 값과 두 번째 인수가 가리키는 값이 같으면 0을 반환합니다.
3. 첫 번째 인수가 가리키는 값이 더 크면 양수 값을 반환합니다.
그림 3-8은 두 인수 이름을 각각 a, b라고 할 때 비교 함수가 반환하는 값을 그림으로 설명한 것
입니다.
118 C 알고리즘