Каждый вызов рекурсивной функции занимает место в стеке потока. В Java Arrays.sort(Object[] a) использует сортировку слиянием. Сортировка слиянием с использованием рекурсивного вызова функции. Почему мы не получаем StackOverflowError для большого массива-списка?
Я искал, в каком случае я должен использовать рекурсию или стек, но я не нашел четкого ответа?
2 ответа
Arrays.sort использует не классическую версию сортировки слиянием из учебника, а гораздо более сложную версию, основанную на TimSort как вы можете прочитать здесь.
Кроме того, в Java размер стека не является фиксированным пределом, а может быть задан как опция JVM.
Вы можете очень легко сгенерировать исключение OutOfMemory или ошибки ограничения стека, если попытаетесь, но (к счастью) библиотечные функции предназначены для того, чтобы попытаться избежать этого.
Типичный стек Java имеет размер не менее 64 КБ. Поскольку идея сортировки слиянием состоит в том, чтобы разбивать массив на 2 на каждом шаге, вам потребуется как минимум, скажем, 3000 разбиений, чтобы получить переполнение стека. Скажем, у вас есть массив объектов размером 32 бита (т.е. примерно 4 миллиарда) элементов, который все еще НАМНОГО меньше 64k. Таким образом, Arrays.sort не подвержен переполнению стека.
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.
Error
) вызывается JVM при переполнении стека. Вы, скорее всего, превысите кучу со слишком большим массивом.