Здравствуйте, давно читаю Хабр и все хотел написать какую-нибудь статью, но не знал с чего начать и о чем писать. Однако решил, что тянуть кота за причинное место. Надо просто взять и написать обзор о чем то, что я знаю и что будет просто для начала. Поэтому решил описать алгоритмы сортировки в размере 37 штук. Я понимаю, что на Хабре есть подобные статьи, однако постараюсь их добавить количеством алгоритмов и приведением небольшого числа графиков. Bubble   Shaker   Insertion   Stooge   Pancake   Shell   Merge   Selection   Quick   Gnome   Tree   Comb   BasicCounting   CombinedBubble   Heapify   Cocktail   OddEven   Tim   Counting   Radix   Bucket   BinaryInsertion   Bogo   Cycle Exchange   Heap   MSDRadix   Ниже представлена таблица с основными характеристиками алгоритмов сортировок. Название Время Память Лучшее Среднее Худшее Bubble       Shaker       Insertion       Stooge       Pancake       Shell    Зависит от выбора шага     Merge       Selection       Quick       Gnome       Tree       Comb       BasicCounting       CombinedBubble       Heapify       Cocktail       OddEven       Tim       Counting       Radix       Bucket       BinaryInsertion       Bogo       Cycle       Exchange       Heap       MSDRadix       Алгоритм состоит в повторяющихся проходах по сортируемому массиву. На каждой итерации последовательно сравниваются соседние элементы, и, если порядок в паре неверный, то элементы меняют местами. За каждый проход по массиву как минимум один элемент встает на свое место, поэтому необходимо совершить не более проходов, где размер массива, чтобы отсортировать массив. Ниже приведен псевдокод сортировки пузырьком, на вход которой подается массив . Производится многократный прогон по массиву, соседние элементы сравниваются и, в случае необходимости, меняются местами. При достижении конца массива направление меняется на противоположное. Таким образом по очереди выталкиваются крупные и мелкие элементы массива в конец и начало структуры соответственно.   Задача заключается в следующем: есть часть массива, которая уже отсортирована, и требуется вставить остальные элементы массива в отсортированную часть, сохранив при этом упорядоченность. Для этого на каждом шаге алгоритма мы выбираем один из элементов входных данных и вставляем его на нужную позицию в уже отсортированной части массива, до тех пор пока весь набор входных данных не будет отсортирован. Метод выбора очередного элемента из исходного массива произволен, однако обычно (и с целью получения устойчивого алгоритма сортировки), элементы вставляются по порядку их появления во входном массиве.    Рекурсивный алгоритм сортировки. Время работы алгоритма, таким образом, крайне большое по сравнению с эффективными алгоритмами сортировки   Aлгоритм сортировки списка элементов заключается в следующем: Если значение элемента в конце списка меньше, чем значение элемента в начале, то поменять их местами. Если есть 3 или более элементов в текущем подмножестве списка, то: Рекурсивно вызвать Stooge sort для первых 2/3 списка Рекурсивно вызвать Stooge sort для последних 2/3 списка Рекурсивно вызвать Stooge sort для первых 2/3 списка снова Иначе: return Единственная операция, допустимая в алгоритме — переворот элементов последовательности до какого-либо индекса. В отличие от традиционных алгоритмов, в которых минимизируют количество сравнений, в блинной сортировке требуется сделать как можно меньше переворотов. Процесс можно визуально представить как стопку блинов, которую тасуют путём взятия нескольких блинов сверху и их переворачивания   Каждый проход в алгоритме характеризуется смещением , таким, что сортируются элементы отстающие друг от друга на позиций. Шелл предлагал использовать Возможны и другие смещения, но всегда. Начало. Шаг 0. . Шаг 1. Разобьем массив на списки элементов, отстающих друг от друга на Таких списков будет  Шаг 2. Отсортируем элементы каждого списка сортировкой вставками. Шаг 3. Объединим списки обратно в массив. Уменьшим . Если неотрицательно   — вернемся к шагу 1 Конец. Алгоритм использует принцип «разделяй и властвуй»: задача разбивается на подзадачи меньшего размера, которые решаются по отдельности, после чего их решения комбинируются для получения решения исходной задачи. Конкретно процедуру сортировки слиянием можно описать следующим образом: Если в рассматриваемом массиве один элемент, то он уже отсортирован — алгоритм завершает работу. Иначе массив разбивается на две части, которые сортируются рекурсивно. После сортировки двух частей массива к ним применяется процедура слияния, которая по двум отсортированным частям получает исходный отсортированный массив. На каждом -ом шаге алгоритма находим -ый минимальный элемент и меняем его местами с  -ым элементом в массиве. Таким образом будет получен массив, отсортированный по не убыванию.   10 -> 2000 Synthetic Быстрый метод сортировки функционирует по принципу "разделяй и властвуй". Массив типа разбивается на два (возможно пустых) под массива и , таких, что каждый элемент  меньше или равен , который в свою очередь, не превышает любой элемент под массива . Индекс вычисляется в ходе процедуры разбиения. Под массивы  и  сортируются с помощью рекурсивного вызова процедуры быстрой сортировки. Поскольку под массивы сортируются на месте, для их объединения не требуются никакие действия: весь массив  оказывается отсортированным. Гномья сортировка основана на технике, используемой обычным голландским садовым гномом. Это метод, которым садовый гном сортирует линию цветочных горшков. По существу он смотрит на следующий и предыдущий садовые горшки: если они в правильном порядке, он шагает на один горшок вперёд, иначе он меняет их местами и шагает на один горшок назад. Граничные условия: если нет предыдущего горшка, он шагает вперёд; если нет следующего горшка, он закончил.   универсальный алгоритм сортировки, заключающийся в построении двоичного дерева поиска по ключам массива (списка), с последующей сборкой результирующего массива путём обхода узлов построенного дерева в необходимом порядке следования ключей. Данная сортировка является оптимальной при получении данных путём непосредственного чтения из потока (например, файла, сокета или консоли).   Построение двоичного дерева. Сборка результирующего массива путём обхода узлов в необходимом порядке следования ключей. Производятся неоднократные прогоны по массиву, при которых сравниваются пары элементов. Если они неотсортированно друг относительно друга - то производится обмен. В результате крупные элементы мигрируют в конец массива, а небольшие по значению - в начало.   Алгоритм сортировки, в котором используется диапазон чисел сортируемого массива для подсчёта совпадающих элементов. Применение сортировки подсчётом целесообразно лишь тогда, когда сортируемые числа имеют (или их можно отобразить в) диапазон возможных значений, который достаточно мал по сравнению с сортируемым множеством, например, миллион натуральных чисел меньших 1000.   Алгоритм состоит из повторяющихся проходов по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется перестановка элементов. Проходы по массиву повторяются   раз или до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны, что означает — массив отсортирован. При каждом проходе алгоритма по внутреннему циклу очередной наибольший элемент массива ставится на своё место в конце массива рядом с предыдущим «наибольшим элементом», а наименьший элемент перемещается на одну позицию к началу массива («всплывает» до нужной позиции, как пузырёк в воде — отсюда и название алгоритма).   Необходимо отсортировать массив  , размером . Построим на базе этого массива за  кучу для максимума. Так как максимальный элемент находится в корне, то если поменять его местами с , он встанет на своё место. Далее вызовем процедуру , предварительно уменьшив  на 1. Она за  просеет  на нужное место и сформирует новую кучу (так как мы уменьшили её размер, то куча располагается с   по  , а элемент  находится на своём месте). Повторим эту процедуру для новой кучи, только корень будет менять местами не с , а . Делая аналогичные действия, пока  не станет равен 1, мы будем ставить наибольшее из оставшихся чисел в конец не отсортированной части. Очевидно, что таким образом, мы получим отсортированный массив. Производится многократный прогон по массиву, соседние элементы сравниваются и, в случае необходимости, меняются местами. При достижении конца массива направление меняется на противоположное. Таким образом по очереди выталкиваются крупные и мелкие элементы массива в конец и начало структуры соответственно. Коктейльная сортировка ещё называется двухсторонней сортировкой простыми обменами. Есть аналогичная модификация и для сортировки выбором.   Производится многократный прогон по массиву, соседние элементы сравниваются и, в случае необходимости, меняются местами. В отличие от пузырьковой сортировки шаг по массиву равен двум, а не единице.   гибридный алгоритм сортировки, сочетающий различные подходы. Данный алгоритм является относительно новым и был придуман Тимом Петерсом. На массивах данных, которые содержат упорядоченные под массивы, алгоритм Тима Петерса показывает себя намного лучше других сортировок. В настоящее время Timsort является стандартной сортировкой в Python и GNU Octave, реализован в OpenJDK 7 и Android JDK 1.5. Алгоритм Timsort состоит из нескольких частей: Начало. Шаг 1. Входной массив разделяется на подмассивы фиксированной длины, вычисляемой определённым образом. Шаг 2. Каждый под массив сортируется сортировкой вставками, сортировкой пузырьком или любой другой устойчивой сортировкой. Шаг 3. Отсортированные под массивы объединяются в один массив с помощью модифицированной сортировки слиянием. Конец. Исходная последовательность чисел длины nn, а в конце отсортированная, хранится в массиве A. Также используется вспомогательный массив Cс индексами от 0 до  , изначально заполняемый нулями. Последовательно пройдём по массиву A и запишем в  количество чисел, равных i. Теперь достаточно пройти по массиву C и для каждого  в массив A последовательно записать число  раз. Для карманной сортировки нужно разбить элементы массива входных данных на k блоков (карманов, корзин). Далее каждый из таких блоков сортируется либо другой сортировкой, либо рекурсивно тем же методом разбиения. После сортировок внутри каждых блоков данные записываются в массив в порядке разбиения на блоки. При этом нужно учитывать, что данная сортировка работает только в том случае, если разбиение на блоки производится таким образом, чтобы элементы каждого следующего блока были больше предыдущего. Карманная сортировка сильно деградирует при большом количестве мало отличных элементов (большинство элементов попадёт в одну корзину). Поэтому такой тип сортировки использовать, когда велика вероятность того, что числа редко повторяются (например, последовательность случайных чисел). Двоичная сортировка вставками — это алгоритм сортировки, похожий на сортировку вставками , но вместо использования линейного поиска для поиска места, куда должен быть вставлен элемент, мы используем двоичный поиск . Таким образом, мы уменьшаем сравнительную ценность вставки одного элемента с O (N) до O (log N).   Неэффективный алгоритм сортировки, используемый только в образовательных целях и противопоставляемый другим, более реалистичным алгоритмам.  Если bogosort использовать для сортировки колоды карт, то сначала в алгоритме нужно проверить, лежат ли все карты по порядку, и если не лежат, то случайным образом перемешать её, проверить лежат ли теперь все карты по порядку, и повторять процесс, пока не от сортируется колода.   Это нестабильный алгоритм сортировки на месте, сортировка сравнением , которая теоретически оптимальна с точки зрения общего количества операций записи в исходный массив , в отличие от любого другого алгоритма сортировки на месте. Он основан на идее, что сортируемая перестановка может быть разбита на циклы , которые можно вращать по отдельности, чтобы получить отсортированный результат.   Алгоритм сортировки обменом — это алгоритм, который сравнивает соседние элементы и перемещает их в правильное положение, меняя их местами на основе правила «меньше». Например, при сортировке по возрастанию мы могли бы поменять местами, если элемент слева больше, чем элемент справа. Итеративное выполнение этого процесса дает нам окончательный список, в котором входные элементы отсортированы в порядке возрастания.  Сортировка пирамидой использует бинарное сортирующее дерево. Сортирующее дерево — это такое дерево, у которого выполнены условия:   Каждый лист имеет глубину либо d, либо ,  максимальная глубина дерева.   Значение в любой вершине не меньше (другой вариант — не больше) значения её потомков . Исходно предназначен для сортировки целых чисел, записанных цифрами. Но так как в памяти компьютеров любая информация записывается целыми числами, алгоритм пригоден для сортировки любых объектов, запись которых можно поделить на «разряды», содержащие сравнимые значения. Например, так сортировать можно не только числа, записанные в виде набора цифр, но и строки, являющиеся набором символов, и вообще произвольные значения в памяти, представленные в виде набора байт.  Для справки Synthetic это данные сформированные функцией рандом в c#, Real это данные сгенерированные как нисходящая прямая с добавлением большого числа шума и выбросов. Тест алгоритмов производился на чистом Windows 10 так как в реальных условиях алгоритмы не будут работать на машинах реального времени, а будут использоваться в программах устанавливаемые пользователями на свои обычные компьютеры. Если кому понадобиться код. Интересный факт что алгоритм BasicCounting  вышел куда быстрее чем стандартный алгоритм сортировки в C#. График красного цвета "Array.Sort".  График черным цветом «BasicCounting».   P.s. Эта статья может понадобится школьником которым интересно какие существуют алгоритмы сортировок и примерные их характеристики. P.s.s Это моя первая статья, тестовая. Так что не будьте строги. Заранее благодарю.     Студент