2015-01-09 3 views
0

빠른 정렬 알고리즘을 구현하려고하는데, 실행하면 결코 멈추지 않고 StackOverflowException으로 끝납니다.QuickSort는 결코 멈추지 않습니다.

(I 알고 내가 할 것처럼, 그것은 가장 효율적인 방법은 아니지만 현재이 그렇게 중요하지 않다, 배열을 rearange하는 두 개의 스택을 사용하여.)

private static void quickSort(int[] a, int start, int end) { 
     if (start >= end) { 
      return; 
     } 

     int pivot = a[start]; 
     Stack<Integer> left = new Stack<Integer>(); 
     Stack<Integer> right = new Stack<Integer>(); 

     for (int i = start + 1; i <= end; i++) { 
      if (a[i] < pivot) { 
       left.push(a[i]); 
      } else { 
       right.push(a[i]); 
      } 
     } 

     int arrayIndex = 0; 
     int middle = 0; 

     while (left.size() > 0) { 
      a[arrayIndex++] = left.pop(); 
     } 

     middle = arrayIndex; 
     a[arrayIndex++] = pivot; 

     while (right.size() > 0) { 
      a[arrayIndex++] = right.pop(); 
     } 

     quickSort(a, start, middle - 1); 
     quickSort(a, middle + 1, end); 
    } 

답변

2
int arrayIndex = 0; 

반드시

int arrayIndex = start; 
+0

으로 대체되어야합니다. 여전히 같은 값으로 오버플로됩니다. (스택을 사용하면 배열에 같은 값이 없을 때 오버플로를 방지하는 재귀 중에 순서가 바뀝니다.) – NiematojakTomasz

+0

감사합니다! 당신이 옳다면,'arrayIndex = start'를 수정하면 그것을 수정합니다. 그러나 피벗은 항상'a [start]'이기 때문에'right' 스택으로 피벗되지 않습니다. 그러나 반복은'start + 1'에서 시작됩니다. – VCODE

+0

처음 시작 + 1 번은 보지 못했습니다. 두 번째 보정을 제거했습니다! – laune

관련 문제