2013-03-12 6 views
0

저는 QuickSort 알고리즘을 알아 내려고했습니다. 그러나 Partition and QuickSort 함수에 배열을 전달할 수없는 것 같습니다. 배열의 첫 번째 요소 만 처리합니다.왜 함수는 배열의 첫 번째 요소 만 사용합니까? (C++)

어떻게 해결할 수 있습니까?

void QuickSort(int a[], int first, int last) 
{ 
    int pivot; 

    if (first < last) 
    { 
     pivot = Partition(a, first, last); 
     QuickSort(a, first, pivot - 1); // <-- HERE 
     QuickSort(a, pivot + 1, last); 
    } 
} 

을 그리고 모든 것은 OK입니다 :

template < class T > int getArrayLen(T & array) { 
    return (sizeof(array)/sizeof(array[0])); 
} 

int Partition(int a[], int first, int last) { 
    int pivot = a[last]; 
    int i = first - 1; 
    for (int j = first; j < last; j++) { 
     if (a[j] <= pivot) { 
      i++; 
      swap(a[i], a[j]); 
     } 
    } 
    swap(a[i + 1], a[last]); 
    return i + 1; 
} 

void QuickSort(int a[], int first, int last) { 
    int pivot; 

    if (first < last) { 
     pivot = Partition(a, first, last); 
     QuickSort(a, first, pivot); 
     QuickSort(a, pivot + 1, last); 
    } 
} 

int main() { 
    int a[] = { 
     4, 32, 3, 13, 48, 45, 12, 54, 7, 42, 3, 12, 5, 24, 20 
    }; 
    int length = getArrayLen(a); 
    QuickSort(a, 0, length - 1); 
} 
+0

@icepack 그 이유는 무엇입니까? 이것이 바로 디버거가 가장 친한 친구 인 상황입니다. –

+2

@icepack : bash.d가 맞습니다. OP는 우리에게 코드를 디버깅 할 것을 요구하고 있습니다. 그는 스스로 그렇게해야합니다. –

+0

@icepack : 부패 코멘트를 다시 작성하십시오. 틀렸어. 여기서 논증은 참조로 전달됩니다. 구현은 일반적이지 않고 안전하지 못하지만이 용도로 작동합니다. –

답변

1

그냥 다시 QuickSort를 호출하기 전에 pivot에서 하나를 줄입니다. a의 다양한 크기에 대한 테스트 : 1, 2, 3, 4, 5, ...

+1

http://liveworkspace.org/code/4BlEkW$7이 답변이 정확한지 확인하십시오. –

+0

확실히 모든 것은 아닙니다 - 질문 아래 @ WhozCraig의 댓글을 참조하십시오. – SomeWittyUsername

+0

@icepack : 나는 그의 의견을 삭제했다고 생각합니다. 어쨌든 괜찮습니다. 질문자가 이상한 논리를 썼지 만 잘 작동합니다. 'i = 1 - 1' 일 때 'i'가 증가하고 (i ++), 그렇지 않으면'i + 1'이 사용됩니다. – deepmax

관련 문제