- •2. Структуры данных. Элементарные данные.
- •3. Линейные структуры данных. Массив.
- •4. Линейные структуры данных. Запись.
- •5. Линейные структуры данных. Множество.
- •6. Линейный однонаправленный список. Способы реализации и основные операции.
- •7. Линейный двунаправленный список. Способы реализации и основные операции.
- •8. Циклический однонаправленный список. Способы реализации и основные операции.
- •9. Циклический двунаправленный список. Способы реализации и основные операции.
- •10. Стек. Способы реализации и основные операции.
- •11. Очередь. Способы реализации и основные операции.
- •12. Дек. Способы реализации и основные операции.
- •13. Мультисписки. Способы реализации и основные операции.
- •14. Слоёные списки. Способы реализации и основные операции.
- •15. Графы. Способы реализации и основные операции.
- •16. Общие сведения о деревьях. Двоичные деревья. Основные определения и способы реализации.
- •17. Обходы деревьев.
- •18. Организация файлов. Общие сведения.
- •21. Методы разработки алгоритмов
- •22. Алгоритмы поиска в линейных структурах. Последовательный (линейный) поиск
- •23. Алгоритмы поиска в линейных структурах. Бинарный поиск
- •24. Хеширование данных. Функция хеширования
- •25. Хеширование данных. Открытое хеширование
- •26. Хеширование данных. Закрытое хеширование
- •27. Поиск данных по вторичным ключам
- •28. Упорядоченные деревья поиска. Способы реализации и основные операции
- •29. Случайные деревья поиска и оптимальные деревья поиска. Основные понятия
- •31. Поиск в тексте. Прямой поиск
- •32. Поиск в тексте. Алгоритм Кнута, Мориса и Пратта
- •33. Поиск в тексте. Алгоритм Боуера и Мура
- •34. Общие сведения об алгоритмах кодирования (сжатия) данных. Метод Хаффмана
- •35. Алгоритм внутренней сортировки подсчетом
- •36. Алгоритм внутренней сортировки простым включением
- •37. Алгоритм внутренней сортировки простым извлечением
- •38. Алгоритм внутренней сортировки методом пузырька
- •39. Алгоритм внутренней быстрой сортировки (Хоара)
- •40. Алгоритм внутренней сортировки слиянием
- •41. Алгоритм внутренней сортировки распределением
- •42. Алгоритмы внешней сортировки
- •43. Алгоритм определения циклов в графе
- •45. Алгоритмы обхода графа. Поиск в ширину (Волновой алгоритм)
- •46. Алгоритмы нахождения кратчайшего пути в графе. Алгоритм Дейкстры
- •47. Алгоритмы нахождения кратчайшего пути в графе. Алгоритм Флойда
- •49. Алгоритмы нахождения минимального остовного дерева графа. Алгоритм Крускала
40. Алгоритм внутренней сортировки слиянием
Этот метод сортирует массив последовательным слиянием пар уже отсортированных подмассивов. Пусть k - положительное целое число. Разобьем массив A[1]...A[n] на участки длины k. (Первый - A[1]...A[k], затем A[k+1]...A[2k] и т. д.) Последний участок будет неполным, если п не делится нацело íà k. Назовем массив упорядоченным, если каждый из этих участков длины 1 упорядочен. Ясно, что любой массив 1-упорядочен, так как его участки длиной 1 можно считать упорядоченными. Если массив упорядочен и n «< <1, то он упорядочен. Рассмотрим процедуру преобразования упорядоченного массива в 2k-упорядоченный. Сгруппируем все участки длины 1 в пары участков. Теперь пару упорядоченных участков сольем в один упорядоченный участок. Проделав это со всеми парами, получим 2Ьупорядоченный массив (рис. 47). Сразу же бросается в глаза недостаток алгоритма - он требует дополнительную память размером порядка и (для хранения вспомогательного массива). Кроме того, он не гарантирует сохранение порядка элементов с одинаковыми значениями. Но ero временная сложность всегда пропорциональна O(nlog n) (так как преобразование k-упорядоченного массива в 2k-упорядоченный требует порядка п действий и внешний цикл по k совершает порядка log n итераций).
41. Алгоритм внутренней сортировки распределением
2.5.2.9. Сортировка распределением Сортировка распределением интересна тем, что она сортирует массив, не сравнивая элементы друг с другом. Рассмотрим сначала вырожденный случай сортировки распределением, а затем более общий. При вырожденном распределении предполагается, что каждый элемент массива может принимать т (например, от 1 до т) фиксированных значений. Заведем массив Amount размерностью т, первоначально обнулив ero. Затем для каждого г подсчитаем количество элементов массива А, равных i, и занесем это число в Amount[i]. После чего, в первые АтоипФ[1] элементов массива А запишем 1, в следующие Amount[2] элементов массива А запишем 2 и т. д. до тех пор, пока не дойдем до конца массива А (заметим, что в то же время мы окажемся в конце массива Amount). Временную сложность метода можно оценить как O(m+n) (т появляется в сумме, так как изначально надо обнулить массив Amount, а это требует т действий). Пространственная сложность в этом случае пропорциональна O(m), поскольку требуется дополнительная память размером порядка т. Недостатком этого метода является то, что требуется дополнительная память размером порядка т, а это может оказаться недопустимым из-за большого значения т. Но, если m»n, то имеется способ уменьшить объем требуемой дополнительной памяти, который сейчас и рассмотрим, как общий случай сортировки распределением. Пусть выделяется дополнительная память размером b+n, а элементы массива могут принимать значения or О до s, причем s»b. Каждый элемент этого массива можно представить в b-ичной системе счисления и разбить на k цифр этой системы счисления. Заведем списки L~, L2, Lb общей суммарной длиной порядка и (это можно сделать, ограничившись дополнительной памятью O(b+n)) (рис. 48).
