
- •2 Статические и динамические объекты программ.
- •6 Вектор. Функциональная спецификация. Логическое описание и физическое представление.
- •14 Стек. Физическое представление (динамические объекты).
- •8 Очередь. Логическое описание и физическое представление (файл).
- •9 Очередь. Логическое описание и физическое представление (массив).
- •10 Очередь. Логическое описание и физическое представление (динамические объекты).
- •61 Обьектно-ориентированное программирование.
- •11 Стек. Функциональная спецификация
- •12 Стек. Логическое описание.
- •17 Линейный список. Физическое представление. Итераторы.
- •Void Create(List *l){ //создание списка
- •If(!res.Node) //если не удалось выделить память (массив заполнен)
- •19 Линейный список. Физическое представление (динамические объекты).
- •29 Рекурсивные структуры данных и их связь с алгоритмической рекурсией
- •1 Уровни описания структур данных.
- •Деревья. Двоичные деревья.
- •23 Двоичное дерево. Функциональная спецификация
- •24 Двоичное дерево. Логическое описание. Построение и визуализация
- •27 Особенности представления и обработки деревьев общего вида (преобразование к двоичному,...)
- •28 Деревья выражений
- •33 Поиск по образцу в последовательностях и таблицах.
- •34 Алгоритм Кнута-Морриса-Пратта
- •37 Таблицы с прямым доступом.
- •43 Турнирные сортировки.
- •46 Сравнение методов сортировки.
- •50 Абстрактные типы данных. Пример модуля лтд очередь.
- •52 Типизация языка программирования. Контроль типов.
- •53 Средства ослабления типового контроля в языке Паскаль. Преобразование и передача типов.
- •54 Полиморфизм операций, отношений и процедур. Родовые модули.
- •41 Обменные сортировки
43 Турнирные сортировки.
В сортируемом множестве можно сравнить пары соседних элементов → из n/2 сравнений получаем меньшую по значению ключей половину (победители); также из получаем четверть и т.д., пока не получим один элемент.
Результат – дерево выбора (турнирная таблица – двоичное дерево, в котором для каждого двудутного узла один из сыновей – он сам (победитель), а другой больше своего отца) ( в корне – самый маленький элемент)
Перевода в множество: а) возьмём корень и запишем его в множество
б) спускаемся от победителя к призёрам по пути победителя, опустошая вершины
в) поднимаясь по этому пути, выполняем перераспределение мест, как будто победителя из п.а не было (элемент, соревнующийся с пустым местом, автоматом переходит в следующий тур)
г) теперь место победителя занял новый элемент; переходим к п.1
Достоинство – сложность всегда О(n * lnn).
{для уменьшения расхода памяти необходимо применить пирамидольное улучшение традиционных древовидных сортировок (hi =<h2ihi =<h[2i+1]); в пирамиде нет повторов элементов сортируемого множества}
Строительство пирамиды: 1) первоначально элемент помещается в вершину, i = 0
2) рассмотрим тройку элементов с индексами i, 2i, 2i+1 (узел и его дети)
3) выберем наименьший из п.2: если он на позиции i, элемент вставлен; ELSE обозначим позицию наименьшего буквой j, где j=j2i или j = 2i + 1, меняем местами элементы i и j
4) переходим к п.2
44 Сортировка Хоара. Быстрые сортировки – те, в которых осуществляются перестановки на большие расстояния. Алгоритм: .
В методе Хоара первоначально выделяют базовый элемент, относительно которого ключи с большим весом перебрасываются вправо, а с меньшим влево. Базовый элемент сравнивается с противоположным элементом. .
В качестве базового элемента очень удобно брать крайние элементы. .
Рассмотрим пример: Дано множество {9,6,3,4,10,8,2,7}.
Берем 9 в качестве базового элемента. Сравниваем 9 с противоположностоящим элементом, в данном случае это 7. 7 меньше, чем 9, следовательно, элементы меняются местами. >> {7,6,3,4,10,8,2,9}.
Далее начинаем последовательно сравнивать элементы с 9, и менять их местами в зависимости от сравнения. {7,6,3,4,10,8,2,9} >> {7,6,3,4,10,8,2,9}>>{7,6,3,4,10,8,2,9}>> {7,6,3,4,9,8,2,10} - 9 и 10 меняем местами. >> {7,6,3,4,8,9,2,10} - 9 и 8 меняем местами. >> {7,6,3,4,8,2,9,10} - 2 и 9 меняем местами. .
После такого перебрасывания элементов весь массив разбивается на два подмножетсва, разделенных элементом 9. >>{7,6,3,4,8,2} {10}.
Далее по уже отработанному алгоритму сортируются эти подмножества. Подмножество из одного элемента естественно можно не сортировать.Выбираем в первом подмножестве базовый элемент 7. >>{7,6,3,4,8,2} >> {2,6,3,4,8,7}-меняем местами 2 и 7>>{2,6,3,4,8,7}>>{2,6,3,4,8,7}>>{2,6,3,4,8,7}>>{2,6,3,4,7,8}-меняем местами 7 и 8
Получили снова два подмножества: {2,6,3,4} {8}.
Достоинства – легко распаралеливается, что полезно в нашь век многопроцессорных/ядерных/потоковых ЭВМ.
(лучший случай - когда каждыё раз медиана выбирается зерном).
Есть ещё и итеративное решение, в котором мы запоминаем границы подпоследовательностей, которые нужно отсортировать, но на практике оба варианта этого алгоритма занимают одинаковое время.
Недостаток – плохо работает при малых n (в прочем, как и все усовершенствованные методы)
45 Сортировки слиянием Решения задачи сортировки:
1) последовательность а разбивается на 2 половины b и c
2) каждая из получившихся частей сортируется отдельно тем же самым алгоритмом
3) два упорядоченных массива половинного размера соединяются в один.
4) части b и c сливаются; при этом одиночные элементы из разных частей образуют упорядоченные пары в выходной последовательности, т.е. первым в ней оказывается меньший из 2х первых элементов
5) полученная последовательность более упорядочена чем изначальная и она снова подвергается разделению и слиянию; при этом упорядоченные пары переходят в четверки, те – в 8ки и т.д. .
Пример(МОЙ!!): (40 47 10 38 80 20 01 50)→(40 47 10 38) ( 80 20 01 50) →(40 80 20 47 01 10 38 50) →(40 80 20 47)(01 10 38 50) →(01 10 40 80 20 38 47 50) →(01 10 40 80)(20 38 47 50) →(01 10 20 38 40 47 50 80)