
- •1. Асимптотическая оценка алгоритма
- •2. Методика оценки не рекурсивных алгоритмов. Пример
- •3. Рекурсивные алгоритмы, построение асимптотической оценки. Пример
- •4. Методика оценки рекурсивных алгоритмов.
- •5. Алгоритмы сортировки массивов за полиномиальное время
- •6. Быстрые алгоритмы сортировки массивов, основанные на сравнении элементов
- •7. Алгоритмы сортировки массивов за линейное время
- •8. Линейные структуры данных, основные операции и характеристики
- •9. Деревья, виды, способы представления, структуры данных, обходы дерева
- •10. Двоичные деревья поиска, операции добавления элементов.
- •11. Двоичные деревья поиска, операции удаления элементов и поиска следующих
- •13. Двоичные кучи, основные операции и характеристики
- •16. Динамическое программирование, основные особенности
- •17. Жадные алгоритмы, основные особенности
- •18. Построение кода Хаффмена
- •19. Алгоритм обхода графов в ширину
- •20. Алгоритм обхода графов в глубину
- •21. Остовое дерево, классификация ребер, топологическая сортировка.
- •22. Сильно связные компоненты, алгоритм поиска
- •23. Построение минимально покрывающего дерева, алгоритм Крускала
- •24. Построение минимального покрывающего дерева, алгоритм Прима
- •25. Происк кратчайшего пути. Алгоритм Дейкстры
- •26. Поиск кратчайшего пути. Алгоритм Беллмана-Форда
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;