Быстрая сортировка
Быстрая сортировка (quick sort) - это рекурсивный алгоритм, который ис-
пользует подход «разделяй и властвуй». Даже если список элементов, который
нужно отсортировать, имеет некоторый минимальный размер, процедура быстрой
сортировки делит его на два подсписка, а затем рекурсивно вызывает себя для их
сортировки.
Исходная версия рассматриваемого алгоритма быстрой сортировки весьма
проста. Если алгоритм вызывается для подсписка, содержащего нуль или один
элемент, подсписок уже отсортирован и процедура заканчивается. В противном
случае процедура выбирает элемент списка и использует его для разбиения спис-
ка на два подсписка. Она помещает элементы, которые меньше, чем разделяющий
элемент, в первый подсписок, а оставшиеся элементы - во второй подсписок. За-
тем она рекурсивно вызывает себя для сортировки обоих подсписков.
Существует много способов выбора разделительного элемента. Программа мо
жет использовать элемент, который на данный момент находится в середине списка.
Но может случиться так, что им окажется наименьший или наибольший элемент
списка. При этом один подсписок будет намного больше другого, и в случае большо-
го количества неудачных выборов, что приведет к сложности алгоритма О(N2) и вы-
зовет глубокую рекурсию.
Другой вариант состоит в том, чтобы просматривать список, вычислять сред-
нее арифметическое всех значений и использовать его как разделитель. Этот под-
ход обычно дает неплохие результаты, но требует много дополнительной работы.
Еще один проход со сложностью порядка O(N) не изменит теоретическое время
выполнения алгоритма, но снизит общую производительность.
Третья стратегия заключается в том, чтобы выбрать средний из элементов в на-
чале, конце и середине списка. Этот метод обладает значительным преимущество
в скорости, так как потребуется выбрать только три элемента. Кроме того, гаранти-
руется, что выбранный элемент не обязательно будет самым большим или самым
маленьким элементом и скорее всего окажется где-нибудь в середине списка.
Сортировка слиянием
Как и быстрая сортировка, сортировка слиянием (merge sort) - это рекурсив-
ный алгоритм. Он так же делит список на два подсписка и рекурсивно их сортирует.
Сортировка слиянием делит список пополам, чтобы сформировать два под-
списка равного размера. Затем подсписки рекурсивно сортируются и сливаются,
образуя полностью отсортированный список.
Кроме того, что процесс объединения несложно понять, это также наиболее ин-
тересная часть алгоритма. Подсписки объединяются в рабочий массив, результат копируется в исходный список.
Сортировка слиянием выполняется немного медленнее, чем быстрая сортиров-
ка.
Преимущество сортировки слиянием в том, что время работы остается од-
ним и тем же для различных представлений данных и начального распределе-
ния. Если в списке имеется много дублированных значений, то быстрая сорти-
ровка имеет время работы O(N2) и входит в глубокую рекурсию. Если список
большой, то алгоритм может переполнить стек и вызвать аварийную остановку.
Поскольку сортировка слиянием всегда делит список на равные части, она ни-
когда не входит в глубокую рекурсию. Для списка из N элементов сортировка
слиянием достигает глубины рекурсии всего log(N).