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);
}
으로 대체되어야합니다. 여전히 같은 값으로 오버플로됩니다. (스택을 사용하면 배열에 같은 값이 없을 때 오버플로를 방지하는 재귀 중에 순서가 바뀝니다.) – NiematojakTomasz
감사합니다! 당신이 옳다면,'arrayIndex = start'를 수정하면 그것을 수정합니다. 그러나 피벗은 항상'a [start]'이기 때문에'right' 스택으로 피벗되지 않습니다. 그러나 반복은'start + 1'에서 시작됩니다. – VCODE
처음 시작 + 1 번은 보지 못했습니다. 두 번째 보정을 제거했습니다! – laune