Алгоритм сортировки подсчетом — реализация на C, Java и Python

Google Translate Icon

Учитывая коллекцию n элементов, каждый из которых имеет неотрицательный целочисленный ключ, максимальное значение которого не превышает k, эффективно отсортируйте его, используя алгоритм сортировки подсчетом.

Практикуйте этот алгоритм

Обзор

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

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

Алгоритм

Алгоритм циклически перебирает элементы, вычисляя гистограмму количества раз, когда каждый ключ входил во входную коллекцию. Затем он выполняет вычисление суммы префиксов, чтобы определить для каждого ключа начальную позицию в выходном массиве элементов, имеющих этот ключ. Наконец, он снова перебирает элементы, перемещая каждый элемент в его отсортированную позицию в выходном массиве.

Алгоритм может быть реализован, как показано ниже, на C, Java и Python. В приведенном ниже коде:

  1. После первого цикла for freq[i] хранит общее количество элементов с ключом, равным i.
  2. После второго цикла for он вместо этого сохраняет общее количество элементов с ключом меньше i, который совпадает с первым индексом, по которому элемент с ключом i должны храниться в выходном массиве.
  3. На протяжении третьего цикла, freq[i] всегда сохраняет следующую позицию в выходном массиве, в которой элемент с ключом i должны быть сохранены, поэтому каждый элемент перемещается в правильное положение в выходном массиве.

C


Скачать  Выполнить код

результат:

1 1 2 2 4 4 10 10 10

Java


Скачать  Выполнить код

результат:

[1, 1, 2, 2, 4, 4, 10, 10, 10]

Python


Скачать  Выполнить код

результат:

[1, 1, 2, 2, 4, 4, 10, 10, 10]

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

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

C


Скачать  Выполнить код

результат:

1 1 2 2 4 4 10 10 10

Java


Скачать  Выполнить код

результат:

[1, 1, 2, 2, 4, 4, 10, 10, 10]

Python


Скачать  Выполнить код

результат:

[1, 1, 2, 2, 4, 4, 10, 10, 10]

Производительность

Временная сложность сортировки подсчетом O(n + k), куда n размер ввода и k является входным диапазоном. Поскольку он использует массивы длины k+1 а также n, общее пространство, используемое алгоритмом, также равно O(n + k). Сортировка подсчетом может быть очень эффективной, когда диапазон ключей k значительно меньше, чем общее количество элементов n, но когда вариация ключей значительно превышает общее количество элементов k >> n, сортировка подсчетом занимает много места.

 
Упражнение:

1. Расширьте решение для обработки отрицательных целых чисел.

2. Укажите точный диапазон ключей, рассчитав максимальную и минимальную разницу значений ключей.

 
Использованная литература: https://en.wikipedia.org/wiki/Counting_sort

Оценить этот пост

Средний рейтинг 4.88/5. Подсчет голосов: 154

Голосов пока нет! Будьте первым, кто оценит этот пост.

Сожалеем, что этот пост не оказался для вас полезным!

Расскажите, как мы можем улучшить этот пост?




Спасибо за чтение.

Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.

Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования :)



Подписывайся
Уведомить о
guest
4 Комментарии
Большинство голосов
Новейшие Самый старый
Встроенные отзывы
Просмотреть все комментарии
НЕ переходите по этой ссылке, иначе вы будете забанены на сайте!