Реализация QuickSort вызывает ошибку StackOverflow, если я предоставляю массив с обратным сортировкой. Он работает нормально около 1000 элементов, но для 10000+ я получаю ошибку StackOverflow. Если я получу ошибку, глубина рекурсии составит около 9000. Я знаю, что мой алгоритм всегда выбирает последний элемент подмассива в качестве точки опоры, что не является оптимальным, но я бы не изменил его, потому что я хочу заставить его работать так. Вот код:Переполнение стека QuickSort на большой вход
private int partition(int[] numbers, int begin, int end) {
int pivot = numbers[end];
int partitionIndex = begin;
for (int i = begin; i < end; ++i) {
comparisonCounter++;
if (numbers[i] <= pivot) {
if (i != partitionIndex) {
swapCounter++;
int temp = numbers[i];
numbers[i] = numbers[partitionIndex];
numbers[partitionIndex] = temp;
}
partitionIndex++;
}
}
if (partitionIndex != end) {
swapCounter++;
int temp = numbers[partitionIndex];
numbers[partitionIndex] = numbers[end];
numbers[end] = temp;
}
return partitionIndex;
}
private void quickSort(int[] numbers, int begin, int end) {
if (begin < end) {
int partitionIndex = partition(numbers, begin, end);
quickSort(numbers, begin, partitionIndex - 1);
quickSort(numbers, partitionIndex + 1, end);
}
}
Есть ли что-то не так с моей реализацией? Как я могу это исправить? Спасибо!
Если список представляет собой массив с обратным сортировкой, и вы всегда выбираете последний элемент в качестве точки опоры, кажется, что вы получите глубину рекурсии примерно длины списка, поскольку один из ваши разделы будут пустыми. –
Из [Википедии] (http://en.wikipedia.org/wiki/Quicksort) «самый левый элемент раздела часто выбирается как свод ... Это вызывает худшее поведение на уже отсортированных массивах. " Поскольку вы используете последнее как свод и реверсивный массив, это худшее поведение. Таким образом, у вас действительно нет хорошей реализации, так как у вас будет O (n^2). Вместо этого вы должны использовать средний или другой элемент. – mbomb007
Спасибо вам обоим. Да, я проверил на худший случай, затем я получил ошибку. Теперь я могу переписать его на итеративный подход. – marfoldi