2.1 Массивы

2.1.12 Быстрая сортировка

Условие

Дан массив из n целых чисел. Отсортируйте его по неубыванию алгоритмом быстрой сортировки (Quick Sort). Выберите опорное значение, разделите обрабатываемую часть массива относительно него и отсортируйте полученные части тем же алгоритмом. Части, содержащие менее двух элементов, не требуют дальнейшей обработки.

Реализуйте алгоритм в отдельной функции void quick_sort(int array[], int left, int right), где left и right — включительные границы обрабатываемой части массива, индексация начинается с нуля. Функция должна изменять переданный массив и не выполнять ввод или вывод. В функции main прочитайте массив, вызовите quick_sort(array, 0, n - 1) и выведите результат. Для обработки частей используйте рекурсивные вызовы: функция вызывает сама себя для меньших частей массива.

Использование готовых функций сортировки, включая qsort и std::sort, запрещено. Алгоритм должен корректно обрабатывать повторяющиеся значения, в том числе массив из одинаковых чисел. При разделении границы должны продвигаться даже при равенстве элементов опорному значению, а последующие вызовы должны получать меньшие части. Учитывайте, что выбор опорного значения влияет на скорость сортировки и глубину рекурсии; проверьте решение также на уже отсортированном массиве и массиве в обратном порядке.

Материал к заданию

Основные виды сортировок и примеры их реализации — Яндекс Образование, раздел «Быстрая сортировка». Реализацию из статьи адаптируйте к массиву и включительным границам left, right, заданным в условии. Выбор последнего элемента в качестве опорного, использованный в статье, может приводить к квадратичному числу операций и линейной глубине рекурсии на отсортированных массивах и массивах из одинаковых значений; при разработке учитывайте указанные в условии случаи.

Ограничения

Время: 2 секунды. Память: 64 МиБ. Вывод: до 2 МиБ. Стандарты: C11 / C++17.

Входные данные

В первой строке вводится целое число n — количество элементов массива. Во второй строке вводятся n целых чисел, разделённых пробелами. Ограничения: 1 ≤ n ≤ 10000, −10⁹ ≤ aᵢ ≤ 10⁹. Значения могут повторяться.

Выходные данные

Выведите n элементов отсортированного массива в одной строке через пробел. Каждый следующий элемент должен быть не меньше предыдущего. Все исходные элементы, включая повторяющиеся значения, должны сохраниться.

Примеры

Вход 1
6
5 -2 0 5 1 -2
Ожидаемый выход
-2 -2 0 1 5 5
Вход 2
4
7 7 7 7
Ожидаемый выход
7 7 7 7
Вход 3
5
5 4 3 2 1
Ожидаемый выход
1 2 3 4 5

Пробный запуск

Код берётся из редактора. Запуск не создаёт посылку и не влияет на баллы.

Выберите пример или введите свои данные и нажмите «Запустить».

Текущая попытка

Отправьте решение. Этапы и результат появятся здесь автоматически.

Все попытки

Войдите, чтобы видеть свои попытки.

Редактор

Один файл до 64 КиБ · Tab / Shift+Tab — отступ · Esc — выход из редактора · черновик сохраняется для этого аккаунта, задачи и языка.