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

05-2절의 recur 함수는 데이터를 임시 저장하기 위해 ‘스택’을 사용했습니다. 이번 퀵 정렬도

                   마찬가지로 ‘스택’을 사용합니다. quick 함수는 다음 2개의 스택을 사용하고 있습니다.


                     1. lstack … 나눌 범위의 왼쪽 끝 요소의 인덱스를 저장하는 스택입니다.
                     2. rstack … 나눌 범위의 오른쪽 끝 요소의 인덱스를 저장하는 스택입니다.



                   이 스택을 생성하는 부분이 초록색 박스로 표시한 부분입니다. 두 스택의 용량은 right – left
                   + 1입니다(나눌 배열의 요소 개수).                 실제로 필요한 용량에 대해서는 다음에 자세히 알아보겠습니다.



                   프로그램의 주요 부분을 오른쪽에 나타냈
                                                           Push(&lstack, left);  0
                   습니다. 그림 6-22와 비교하면서 살펴보                 Push(&rstack, right);
                                                                                             1
                   세요.                                     while(!IsEmpty(&lstack)) {
                                                             int pl = (Pop(&lstack, &left),  left);
                                                             int pr = (Pop(&rstack, &right), right);
                    0  lstack에 left를, rstack에 right를 푸시      /* 중략 : a[left] ~ a[right]를 나눕니다. */
                                                                                             2
                   합니다. 그림의  a   에서 볼 수 있듯이 lstack           if(left < pr) {
                                                               Push(&lstack, left);  /* 왼쪽 그룹 범위의 */
                   에 푸시되는 값은 0, rstack에 푸시되는 값                 Push(&rstack, pr);    /* 인덱스를 푸시합니다. */
                                                             }
                   은 8입니다.                                   if(pl < right) {
                                                               Push(&lstack, pl);    /* 오른쪽 그룹 범위의 */
                                                               Push(&rstack, right); /* 인덱스를 푸시합니다. */
                                                             }
                    1  lstack에서 팝한 값을 left에 대입한 다
                                                           }
                   음 그 left의 값을 다시 pl에 대입합니다
                   (rstack도 같은 과정을 거칩니다). 그 결과 left와 pl의 값은 0, right와 pr의 값은 8이 됩니다. 이 값
                   은 정렬할 배열의 범위를 의미합니다. 이렇게 값을 설정하면 a[0] ~ a[8]이 배열 왼쪽 그룹

                   (a[0] ~ a[4])과 오른쪽 그룹(a[5] ~ a[8])으로 나누어집니다.


                    2  첫 번째 if문에서 lstack, rstack에 각각 0과 4를 푸시하고 두 번째 if문에서 각각 5와 8을

                   푸시합니다. 그 결과 스택은  c  상태가 되고 그런 다음 while문에 의해 루프 본체( 1 ,  2 )가 반
                   복됩니다.


                    1  lstack에서 5가 팝되어 left와 pl에 대입되고, rstack에서 8이 팝되어 right와 pr에 대입됩

                   니다( d ). 이 과정을 거치고 나면 배열의 한 부분(a[5] ~ a[8])으로 나누어집니다. 즉, a[5] ~
                   a[6]의 왼쪽 그룹과 a[7] ~ a[8]의 오른쪽 그룹으로 나누어집니다.







                   234   C 알고리즘
   229   230   231   232   233   234   235   236   237   238   239