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

왼쪽, 오른쪽의 각 그룹을 다시 나누기 위해 초록색 박스로 표시한 부분에서 2회의 재귀 호출

                        이 있는 것을 제외하면 앞에서 작성한 실습 6-8과 거의 같습니다.
                           퀵 정렬은 서로 이웃하지 않고 멀리 떨어져 있는 요소를 교환해야 하므로 안정적이지 않습니다.


                         연습      Q13  아래 형식으로 동작하는 quick_sort 함수를 구현하세요. 두 번째 매개변수인 n은 요소의
                         문제     개수입니다.

                                  void quick_sort(int a[], int n);







                            보충수업 6-1   퀵 정렬에서 분할 과정 출력하기
                        앞에서 작성한 퀵 정렬 프로그램은 진행 과정을 출력하지 않습니다. 퀵 정렬을 수행하는 quick 함수를
                        실습 6C-1처럼 수정하면(초록색 박스로 표시한 부분 추가) 배열을 나누는 모습이 출력되어 이해하기가
                        조금 더 쉬워집니다.



                          실습 6C-1                                                •완성 파일 chap06/quick_v.c
                         01  /*--- 배열의 분할 과정을 출력하는 퀵 정렬 프로그램 ---*/
                                                                         초록색 박스로 표시한 부분의 실행 결과
                         02  void quick (int a[], int left, int right)
                                                                        a[0]~a[8] : {5, 8, 4, 2, 6, 1, 3, 9, 7}
                         03  {                                          a[0]~a[4] : {5, 3, 4, 2, 1}
                         04    int pl = left;           /* 왼쪽 커서 */     a[0]~a[2] : {1, 3, 2}
                         05    int pr = right;          /* 오른쪽 커서 */    a[0]~a[1] : {1, 2}
                         06    int x = a[(pl + pr) / 2]; /* 피벗(가운데 요소) */  a[3]~a[4] : {4, 5}
                                                                        a[5]~a[8] : {6, 8, 9, 7}
                         07
                                                                        a[5]~a[6] : {6, 7}
                         08    int i;
                                                                        a[7]~a[8] : {9, 8}
                         09    printf("a[%d]~a[%d] : {", left, right);
                         10    for(i = left; i < right; i++)
                         11      printf("%d ", a[i]);
                         12    printf("%d}\n", a[right]);
                         13
                         14    do {
                         15      while(a[pl] < x) pl++;
                         16      while(a[pr] > x) pr--;
                         17      if(pl <= pr) {
                         18        swap(int, a[pl], a[pr]);
                         19        pl++;
                         20        pr--;






                                                                                          06•정렬  231
   226   227   228   229   230   231   232   233   234   235   236