2017-12-24 27 views
0

좋은 하루! 내 quickSort 알고리즘을 실행할 때 StackOverflowError이 표시됩니다.많은 요소가있는 QuickSort가 StackOverflowError를 발생시킵니다

public void recQuickSort(int left, int right) 
{ 
    if(right-left <= 0) 
     return; 
    else { 
     long pivot = a[right]; 
     int partition = partitionIt(left, right, pivot); 
     recQuickSort(left, partition-1); 
     recQuickSort(partition+1, right); 
    } 
} 
public int partitionIt(int left, int right, long pivot) { 
    int leftPtr = left - 1; 
    int rightPtr = right; 
    while (true) { 
     while (a[++leftPtr] < pivot) ; 
     while (rightPtr > 0 && a[--rightPtr] > pivot) ; 
     if (leftPtr >= rightPtr) 
      break; 
     else 
      swap1(leftPtr, rightPtr); 
    } 
     swap1(leftPtr, right); 
     return leftPtr; 
} 

public void swap1(int dex1, int dex2) // Permutation of two elements 
{ 
    long temp; 
    temp = a[dex1]; 
    a[dex1] = a[dex2]; 
    a[dex2] = temp; 
} 

가 어떻게이 오류 요소> 50 000을 수정할 수 있습니다 이 오류는 다음과 같습니다 배열> 50 000

내 코드에서 때 요소를 발생?

+1

이것은 모든 리 커브 알고리즘에 내재 된 문제입니다. 결국 스택 메모리가 부족합니다. Java에 대한 부분적인 수정은 [here] (https://stackoverflow.com/questions/3700459/how-to-increase-the-java-stack-size)이지만 입력 크기가 충분히 크면 언제나 사용할 수 있습니다. StackOverflowException을 생성한다. – Turing85

+1

당신은 재귀 함수를 사용하고 있으며 매번 입력을 반으로 분할합니다. '50,000' 엘리먼트를 사용하면'log_2 (50000) ~ = 16' 주위의 가장 좋은 스택 깊이를 볼 수 있습니다. 최악의 경우 스택 깊이는 '50000'입니다. 이것은 스택 오버 플로우에 매우 취약합니다. – hnefatl

+1

가능한 [Java 스택 크기를 늘리는 방법] (https://stackoverflow.com/questions/3700459/how-to-increase-the-java-stack-size) – Turing85

답변

1

작은 파티션에서 재귀 만 수행 한 다음 왼쪽 또는 오른쪽으로 업데이트하고 큰 파티션을 루프 백합니다. 이렇게하면 스택 오버플로 (log2 (n) 스택 프레임 제한)가 방지되지만 최악의 시간 복잡도 O (n^2)는 방지되지 않습니다.

public void recQuickSort(int left, int right) 
{ 
    while(true){ 
     if(right-left <= 0) 
      return; 
     else { 
      long pivot = a[right]; 
      int partition = partitionIt(left, right, pivot); 
      if((partition - left) <= (right - partition)){ 
       recQuickSort(left, partition-1); 
       left = partition+1; 
      } else { 
       recQuickSort(partition+1, right); 
       right = partition-1; 
      } 
     } 
    } 
}