Сортировка По Распространению



Сортировка по распространению

При сортировке по распределению элементы распределяются и перераспределяются по классам, пока массив не будет отсортирован.

В самом общем случае это происходит примерно по той же схеме.

Элементы разбросаны по классам по какому-либо признаку.

Если это не приводит к упорядочению массива, то характеристики принадлежности к классам уточняются и элементы снова раскидываются по уточненным классам.

И так происходит до тех пор, пока массив не станет упорядоченным.

При сортировке по распределению почти всегда отсутствует сравнение элементов друг с другом и их обмены.

Главное – принадлежит ли элемент определенному классу или нет; его сравнение с другими элементами редко имеет значение.

Эти сортировки обычно имеют линейную временную сложность (а не логарифмическую сложность, как в случае эффективных сортировок обмена, слияния, выбора или вставки).

Также алгоритмы этого класса почти всегда требуют много дополнительной памяти, поскольку элементы, сгруппированные по классам, нужно где-то хранить.

Сортировки распределения хороши для упорядочивания целых чисел и строк.

С их помощью обычно неудобно сортировать действительные числа.

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



Сортировка по распространению

Данная статья написана при поддержке EDISON. Мнение клиента: 10 преимуществ программистов от EDISON Это интересно и полезно знать: завтрак программиста
Рассмотрим алгоритм, наиболее наглядно демонстрирующий указанные выше свойства.



Сортировка ведром :: Сортировка ведром

Другие названия — сортировка корзиной, сортировка блоками, сортировка карманами.

Раскидываем числа по корзинам, затем в каждой корзине раскидываем их по более мелким корзинам и так до тех пор, пока на каком-то уровне в корзине не останутся только одинаковые элементы.

Тогда из таких корзин самого нижнего уровня легко восстановить массив в упорядоченное состояние.

Поясним на конкретном примере.

Допустим, у нас есть неупорядоченный массив.

Мы знаем, что этот массив содержит числа от 1 до 8.

Сортировка по распространению

Разделим эти числа на 2 группы: в одну группу входят числа от 1 до 4, во вторую — от 5 до 8. Затем числа из первой корзины распределим на две корзины: в одной — числа 1 и 2, а в другой — числа 1 и 2. остальные 3 и 4. Эти корзины также распределяем по корзинам, в которых уже есть числа одинакового размера.

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

Сортировка сегментами в этой форме не особенно применима на практике, но она демонстрирует, как в целом работают все сортировки распределения.



Сортировка Таноса :: Сортировка Таноса

Иногда мне присылают авторские сорта и это как раз такой случай.

Автор Андрей Данилин назвал это «Русской сортировкой пополам», а я назвал это сортировкой Таноса.

Или, если формально исходить из используемых методов, можно назвать это среднеарифметической сортировкой по корзине.



Сортировка по распространению

Вычисляется среднее арифметическое элементов массива, а затем все элементы делятся на 2 группы.

Одна группа содержит элементы меньше (или равные) среднего арифметического, вторая группа содержит элементы больше среднего арифметического.

Затем к обеим группам рекурсивно применяются одни и те же действия — и так до победного конца.

При чем здесь безумный титан? Если это случайный массив, то по большому счету элемент при сравнении со средним арифметическим имеет вероятность 50/50, что он попадет в одну из двух групп.

Кстати, в Интернете я наткнулся на еще один шуточный алгоритм с таким же названием.

Если массив не отсортирован, то щелкаем Перчатку Бесконечности и отправляем в небытие случайно выбранную половину элементов массива.

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

Если еще нет, то можно сделать еще несколько кликов.



Сортировка по распространению

Однако вернемся к нашим сортировкам по распределению.

Всех их можно разделить всего на две группы – сортировка по подсчету И поразрядные сортировки .

Ну а если хотите, то тоже можно выделить подсчет сортов , то есть те, которые можно отнести к обоим.

Существуют и гибридные алгоритмы (это те, которые используют методы разных классов, например, сортировка Тима — нечто среднее между сортировкой слиянием и сортировкой вставками, интроспективная сортировка — быстрая сортировка, переходящая в пирамидальную сортировку и т. д.), включая сортировку распределением, однако , гибриды - это отдельный раздел.

Подробнее о них позже.

Сортировка ведром и сортировка среднего арифметического Таноса являются счетными сортировками.



Сортировка по подсчету

Основная идея заключается в том, что мы подсчитываем, сколько чисел содержится в каждом классе.



Сортировка подсчетом :: Сортировка подсчетом

Мы подсчитываем, сколько раз определенное число встречается в массиве.

Зная эти величины, мы быстро формируем уже упорядоченный массив.



Сортировка по распространению

Чтобы выполнить эту сортировку, вам нужно знать минимум и максимум в массиве.

Затем генерируются ключи для вспомогательного массива, в котором мы записываем, что и сколько раз произошло.

Код Python:

   

def CountingSort(array, mn, mx):

Теги: #python #Алгоритмы #Визуализация данных #Идеальный код #edisonsoftware #edisonsoftware #edisonsoftware #Сортировки
Вместе с данным постом часто просматривают: