Причина двоякая: во-первых, вы используете наихудшее из возможных значений разворота. Для уже отсортированных массивов требуется O (n ^ 2) времени выполнения. Обычно используемые стратегии состоят в том, чтобы использовать случайный элемент в качестве значения разворота, или среднего элемента, или медианы первого, последнего и среднего элемента.
Другая причина в том, что ваш стек переполнен из-за того, как вы делаете рекурсию. Чтобы избежать этого: найдите меньший диапазон и отсортируйте его рекурсивно. Затем отсортируйте больший диапазон, не используя рекурсию, а внутри той же функции, изменив параметр «first» и «last». Таким образом, глубина стека будет не более log n.
Если ваша цель состоит в том, чтобы скопировать алгоритм из Википедии, ваш код в порядке, и сбой только ожидается. Если ваша цель - сортировать данные, то скопированный псевдокод не очень хорош.