Quick Sort 알고리즘 중

Horowitz의 C로 쓴 자료구조론을 보고 있슴다.
그중 퀵소트와 관련해서 미궁에 빠졌네요.
책의 336페이지에 보면 퀵소트를 아래와 같이 구현해놓았어요.

void quicksort(element list[], int left, int right)
{
    int pivot, i, j;
    element temp;
    if( left < right ) {
        i = left, j = right + 1;
        pivot = left[left].key;
        do {
            do {
                i++;
            } while (list[i].key < pivot);
            do {
                j--;
            } while (list[j].key > pivot);
            if( i < j )
                SWAP(list[i], list[j], temp);
        } while ( i < j );
        SWAP(list[left],list[j],temp);
        quicksort(list, left, j-1);
        quicksort(list, j+1, right);
    }
}

여기서 질문.
7~9줄에 i가 list배열의 index를 벗어나지 않는다는 걸 어떻게 보장하죠??
예를 들어 pivot 값이 배열에서 가장 큰 값이라고 가정하면
9라인의 while(list[i].key < pivot)은 언제나 true이므로
i는 계속해서 커지다가 list배열의 인덱스 바깥으로 튀어나가 에러를 만들지 않을까요??

책의 오른쪽 여백에 예전에 보면서 끼적거려놓은게 있는데 "pivot값이 최대값이면 어떻하지?"라고 되어있습니다. 그래서 어쩌라고 ㅡㅜ 과거의 내가 미래의 나에게 숙제를 던지는 아햏햏한 시츄에이션이어요.

Posted by 망고

04 7, 2008 12:18 04 7, 2008 12:18
Response
No Trackback , 7 Comments
RSS :
http://www.shimminkyu.com/tc/rss/response/782

Trackback URL : http://www.shimminkyu.com/tc/trackback/782

Comments List

  1. 넌머하고사냐  2008年 04月 07日 16時 09分 # M/D Reply Permalink

    dblab.duksung.ac.kr/ds/pdf/Chap12.pdf

    1. 망고 2008年 04月 07日 16時 47分 # M/D Permalink

      역시 i <= right인지 검사하는군요. 감사 :)

  2. 넌머하고사냐  2008年 04月 07日 17時 02分 # M/D Reply Permalink

    심심하니까~ 질문^^

    그럼 pivot값이 최소값일땐, 어떻게 될까요? ^^

    1. 망고 2008年 04月 07日 19時 26分 # M/D Permalink

      list[left].key = pivot 이므로 j값이 left일때 while문에서 튀어나오죠. 맞나요?

  3. 넌머하고사냐  2008年 04月 09日 22時 46分 # M/D Reply Permalink

    음...쫌더 생각해보세요...

    j가 left일때 while문에서 튀어나오면 될까요?

    1. 망고 2008年 04月 09日 23時 07分 # M/D Permalink

      옴마야 코드 잘못 옮겨적었네요 ㅡㅡ;;
      수정합니다.
      이전 코드는 아예 컴파일 에러 상황..

      그래도 답은 해야죠? :)
      pivot이 최소값일때
      i = 1
      j = 0
      일 때 내부 while문에 나오게 되고
      i < j 인 조건을 만족하지 않으므로
      외부 while문도 빠져나오게 됩니다.

      그다음 배열 좌측 quicksort문에서는 left>right인 파라미터를 던져주게 되니 순환호출도 끝. 배열 우측 quicksort문은 최소값인 pivot값을 빼고 계속 진행되구요.

  4. 아직도궁금할까봐 2008年 10月 16日 11時 09分 # M/D Reply Permalink

    배열 A[n].key에 무한대(대부분 data type의 최대값)를 저장하면 됩니다.
    이런걸 sentinel value라고 하죠. 배열의 끝을 매번 비교하는 걸 막기 위해서죠.
    Horowitz 아저씨의 sentinel 안배가 많은 부분이 sort 부분인 거 같습니다.
    실제로도 이런 sentinel value를 이용하여 실제적으로 간략한 소스를 많이 구현하죠.

Leave a comment
[로그인][오픈아이디란?]
« Previous : 1 : ... 105 : 106 : 107 : 108 : 109 : 110 : 111 : 112 : 113 : ... 764 : Next »

Recent Photo

recent photo from http://mangolog.tistory.com/ from Mango PhotoLog

Stay Foolish, Stay Hungry.

- 망고


Seoul

Paris

Authors

  1. 망고

Schedule

«  »
with Google Calendar API

Site Stats

Total hits:
200712
Today:
2
Yesterday:
371