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

0   1   2   3    4   5    6
                                                1   3    4   6    7   8    9

                         비교는 하지만                1   3    4   6    7   8    9     (n – 4) 회
                         교환하지는 않습니다.
                                                1   3    4   6    7   8    9
                             6은 4번째 위치로
                             이동합니다.
                                                1   3    4   6    7   8    9

                                                  정렬이 끝난 상태

                                             [그림 6-7] 버블 정렬의 네 번째 패스


                        이미 배열이 정렬을 마친 상태라면 그 이후의 패스는 요소 교환을 하지 않습니다. 그림에서
                        는 이 모습을 생략했지만 다섯 번째, 여섯 번째 패스에서도 요소 교환을 하지 않습니다.



                        즉, 어떤 패스에서 요소의 교환 횟수가 0이면 더 이상 정렬할 요소가 없다는 뜻이기 때문에 정
                        렬 작업을 멈추면 됩니다. 처음 주어진 배열이 아래와 같은 상태라고 가정하겠습니다.

                                                1    3   4    6   7    8   9


                        첫 번째 패스에서 교환이 수행되지 않으므로 첫 번째 패스를 마친 다음에 정렬 작업을 멈춥니
                        다. 이런 방식(멈춤)을 도입하면 정렬을 마친 배열이나 정렬이 거의 다 된 상태의 배열에 대한

                        비교 연산이 많이 생략되어 짧은 시간에 정렬을 마칠 수 있습니다. 실습 6-2는 이런 ‘멈춤’으
                        로 개선한 버블 정렬 함수(버전 2)입니다.                      bubble2.c는 매크로 함수인 swap 함수와 main
                                                                   함수가 필요합니다. 실습 6-1을 참고하세요.

                          실습 6-2                                                 •완성 파일 chap06/bubble2.c
                         01  /*--- 버블 정렬(버전 2 : 교환 횟수에 따라 정렬 작업을 멈춥니다.) ---*/
                         02  void bubble(int a[], int n)
                         03  {
                         04    int i, j;
                         05    for(i = 0; i < n - 1; i++) {
                         06      int exchg = 0;                 /* 패스에서 시도한 교환 횟수 */
                         07      for(j = n - 1; j > i; j--)
                         08        if(a[j – 1] > a[j]) {
                         09          swap(int, a[j – 1], a[j]);  패스
                         10          exchg++;
                         11        }
                         12      if(exchg == 0) break;           /* 교환이 수행되지 않았다면 정렬을 멈춥니다. */
                         13    }
                         14  }



                                                                                          06•정렬  205
   200   201   202   203   204   205   206   207   208   209   210