Page 109 - Do it! 자료구조와 함께 배우는 알고리즘(C 언어, 3쇄)
P. 109

b  새로 검색할 범위에서 중앙 요소의 값은 15(a[2])입니다. 키 값인 6보다 크므로 검색할 범

                        위를 a[0] ~ a[1]로 좁힙니다.


                        c  새로 검색할 범위에서 중앙 요소의 값은 5(a[0])입니다. 키 값인 6보다 작으므로 pl을 pc +
                        1(1)로 업데이트합니다. 그러면 pl과 pr은 1이 됩니다.



                        d  축소된 범위의 중앙 요소의 값은 7(a[1])입니다. 키 값인 6보다 크므로 pr을 pc – 1(0)로 업
                        데이트합니다. 그러면 pl이 pr보다 커지면서 검색 범위를 더 이상 계산할 수 없게 됩니다. 종

                        료 조건 ②가 성립하므로 검색 실패입니다.

                        이 과정(이진 검색)을 구현한 프로그램이 실습 3-4입니다. 이진 검색은 검색을 반복할 때마다
                        검색 범위가 절반이 되므로 검색에 필요한 비교 횟수의 평균값은 log n입니다. 검색에 실패한

                        경우는⎡log(n + 1)⎤회, 검색에 성공한 경우는 대략 log n – 1회입니다.


                        이진 검색 알고리즘은 검색 대상(배열)이 정렬(sort)되어 있음을 가정합니다. 따라서 이 프로그

                        램의 색칠된 부분은 사용자가 각 요소의 값을 입력하는 과정에서 바로 앞에 입력한 요소보다
                        작은 값인 경우에는 다시 입력하게 합니다. 위의⎡log(n + 1)⎤에 사용한 ⎡⎤는 천장 함수
                        (ceiling function)를 나타내는 기호입니다. 즉, ⎡x⎤는 x의 천장 함수이며, x보다 크거나 같으
                        면서 가장 작은 정수입니다. 예를 들어,  ⎡3.5⎤는 4입니다. 천장 함수를 올림 함수라고도 합

                        니다.


                          실습 3-4                                               •완성 파일 chap03/bin_search.c
                         01  /* 이진 검색 */
                                                                                      실행 결과
                         02  #include <stdio.h>
                                                                                이진 검색
                         03  #include <stdlib.h>                                요소 개수 : 7
                         04                                                     오름차순으로 입력하세요.
                         05  /*--- 요소의 개수가 n인 배열 a에서 key와 일치하는 요소를 이진 검색 ---*/  x[0] : 15
                         06  int bin_search(const int a[], int n, int key)      x[1] : 27
                         07  {                                                  x[2] : 39
                                                                                x[3] : 77
                         08     int pl = 0;          /* 검색 범위 맨 앞의 인덱스 */
                                                                                x[4] : 92
                         09     int pr = n - 1;       /* 검색 범위 맨 끝의 인덱스 */      x[5] : 118
                         10     int pc;              /* 검색 범위 한가운데의 인덱스 */      x[6] : 121
                         11     do {                                            검색값 : 39
                         12       pc = (pl + pr) / 2;                           39는(은) x[2]에 있습니다.
                         13       if(a[pc] == key)    /* 검색 성공 */




                                                                                          03•검색  109
   104   105   106   107   108   109   110   111   112   113   114