Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Algoritmy_-_Ekzamen.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
2.13 Mб
Скачать

7. Алгоритмы сортировки массивов за линейное время

  • Все n входных элементов - целые числа, принадлежащие [0,k],

где k - целая константа.

  • Если k = O(n), то T(n) = Θ(n)

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

Исходная последовательность чисел длины n, в конце отсортированная, хранится в массиве A. Также используется вспомогательный массив C с индексами от 0 до k-1 , изначально заполняемый нулями.

Последовательно пройдём по массиву A и запишем в C[i] количество чисел, равных i .

Теперь достаточно пройти по массиву C и для каждого number в массив A последовательно записать число number C[number] раз.

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;

Сортировка за линейное время. Цифровая сортировка

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

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

Для чисел уже существует понятие разряда, поэтому будем представлять числа как последовательности разрядов.

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

Рассмотрим сортировку чисел. В качестве устойчивой сортировки применяют сортировку подсчетом, так как обычно количество различных значений разрядов не превосходит количества сортируемых элементов. Ниже приведен псевдокод цифровой сортировки, которой подается массив A m-разрядных чисел размера n. Сам по себе алгоритм представляет собой цикл по номеру разряда, на каждой итерации которого элементы массива размещаются в нужном порядке во вспомогательном массиве B. Для подсчета количества объектов, i-й разряд которых одинаковый, а затем и для определения положения объектов в массиве B используется вспомогательный массив C. Функция digit(x,i) возвращает i-й разряд числа х. Также считаем, что значения разрядов меньше k.

radixSort(A)

for i = 1 to m

for j = 0 to k - 1

C[j] = 0;

for j = 0 to n - 1

d = digit(A[j], i);

C[d] += 1; count = 0;

for j = 0 to k - 1

tmp = C[j];

C[j] = count;

count = count + tmp;

for j = 0 to n - 1

d = digit(A[j], i);

B[C[d]] = A[j];

C[d] += 1;

A = B;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]