Я работал над этим кодом несколько дней безуспешно из-за ошибки переполнения стека во время рекурсии.
Проблема заключается в том, что наша точка опоры всегда является 0-м элементом, и с помощью рекурсии мы можем сортировать массив, либо меняя местами, либо создавая новые массивы и копируя их в исходный массив. Я решил создать 2 массива, так как мне их легче понять, но как только я достигаю рекурсивного шага, я получаю эту ошибку.
Я проследил алгоритм и понял, что опорный элемент всегда помещается в нижний массив и может быть проблемой.
enter code here
public static void main(String[] args) {
int[] arr = new int[] { 12, 7, 5, 8, 4, 6, 11, 15 };
quicksort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
private static int[] quicksort(int[] arr, int middle) {
// Base case
if (arr.length == 1) {
return arr;
}
int[] upper = new int[arr.length];
int[] lower = new int[arr.length];
int upperIndex = 0, lowerIndex = 0;
// Put the elements into their respective pivots
for (int i = 0; i < arr.length; i++) {
if (arr[i] <= middle) {
lower[lowerIndex++] = arr[i];
} else {
upper[upperIndex++] = arr[i];
}
}
// Recurse, and sort the pivots
lower = quicksort(lower, lower[0]);
upper = quicksort(upper, upper[0]);
// Combine lower, middle, and upper back into one array
System.arraycopy(lower, 0, arr, 0, lowerIndex);
arr[lowerIndex + 1] = middle;
System.arraycopy(upper, 0, arr, lowerIndex + 2, upperIndex);
return arr;
}
В результате должен получиться отсортированный массив в порядке возрастания.