Участник:Nechaev/Черновик — различия между версиями
Nechaev (обсуждение | вклад) м |
Nechaev (обсуждение | вклад) (→Основная идея) |
||
Строка 2: | Строка 2: | ||
== Основная идея == | == Основная идея == | ||
− | Основная идея сортировки подсчетом заключается в том, чтобы для каждого элемента <tex>x</tex> определить количество элементов, которые меньше <tex>x</tex>. С помощью этого, мы можем поместить элемент туда, где он должен находиться в отсортированном массиве. Например, если есть <tex>42</tex> элемента, которые меньше <tex>x</tex>, то после сортировки он будет занимать <tex>43</tex>-ю позицию. Если допускается, что несколько элементов могут иметь одинаковое значение, то алгоритм придётся модифицировать, потому что мы не можем разместить все такие элементы в одной позиции. | + | /--переписать--/ Основная идея сортировки подсчетом заключается в том, чтобы для каждого элемента <tex>x</tex> определить количество элементов, которые меньше <tex>x</tex>. С помощью этого, мы можем поместить элемент туда, где он должен находиться в отсортированном массиве. Например, если есть <tex>42</tex> элемента, которые меньше <tex>x</tex>, то после сортировки он будет занимать <tex>43</tex>-ю позицию. Если допускается, что несколько элементов могут иметь одинаковое значение, то алгоритм придётся модифицировать, потому что мы не можем разместить все такие элементы в одной позиции. // |
Использование сортировки подсчётом целесообразно, когда диапазон возможных значений входных данных достаточно мал по сравнению с количеством элементов в сортируемом множестве, например, миллион натуральных чисел меньших <tex>1000</tex>. Эффективность алгоритма падает, когда необходимо сортировать различные элементы, попавшие в одну ячейку. | Использование сортировки подсчётом целесообразно, когда диапазон возможных значений входных данных достаточно мал по сравнению с количеством элементов в сортируемом множестве, например, миллион натуральных чисел меньших <tex>1000</tex>. Эффективность алгоритма падает, когда необходимо сортировать различные элементы, попавшие в одну ячейку. |
Версия 21:49, 17 мая 2012
Сортировка подсчётом — алгоритм сортировки целых чисел в диапазоне от
до некоторой константы , работающий за линейное время.Содержание
Основная идея
/--переписать--/ Основная идея сортировки подсчетом заключается в том, чтобы для каждого элемента
определить количество элементов, которые меньше . С помощью этого, мы можем поместить элемент туда, где он должен находиться в отсортированном массиве. Например, если есть элемента, которые меньше , то после сортировки он будет занимать -ю позицию. Если допускается, что несколько элементов могут иметь одинаковое значение, то алгоритм придётся модифицировать, потому что мы не можем разместить все такие элементы в одной позиции. //Использование сортировки подсчётом целесообразно, когда диапазон возможных значений входных данных достаточно мал по сравнению с количеством элементов в сортируемом множестве, например, миллион натуральных чисел меньших
. Эффективность алгоритма падает, когда необходимо сортировать различные элементы, попавшие в одну ячейку.Простой алгоритм
Это простейший вариант алгоритма. Создать вспомогательный массив
SimpleCountingSort for number = 0 to k - 1 C[number] = 0; for i = 0 to length[A] - 1 C[A[i]] = C[A[i]] + 1; pos = 0; for number = 0 to k - 1 for i = 0 to C[j] - 1 A[pos] = number; pos = pos + 1;
Устойчивый алгоритм
В этом варианте помимо входного массива сортировке сложных структур данных.
StableCountingSort for number = 0 to k - 1 C[number] = 0; for i = 0 to length[A] - 1 C[A[i]] = C[A[i]] + 1; for number = 1 to k - 1 C[j] = C[j] + C[j - 1]; for i = length[A] - 1 to 0 B[C[A[i]]] = A[i]; C[A[i]] = C[A[i]] - 1;
Обобщение на произвольный целочисленный диапазон
Если диапазон значений (min и max) заранее не известен, можно воспользоваться линейным поиском min и max, что не повлияет на асимптотику алгоритма. При работе с массивом
из необходимо вычитать min, а при обратной записи прибавлять.Анализ
В первом алгоритме первые два цикла работают за
и , соответственно; двойной цикл за . Во втором алгоритме циклы занимают , , и , соответственно. Итого оба алгоритма имеют линейную временную трудоёмкость . Используемая память в первом алгоритме равна , а во втором .На практике сортировка подсчетом применяется, когда
, а в этом случае время работы алгоритма равноИсточники
- Томас Кормен, Чарльз Лейзерсон, Рональд Ривест, Клиффорд Штайн. «Алгоритмы. Построение и анализ» — «Вильямс», 2011 г. — 1296 стр. — ISBN 978-5-8459-0857-5, 5-8459-0857-4, 0-07-013151-1
- Сортировка подсчетом — Википедия