- •Саод, семестр 1
- •Абстрактные типы данных
- •Типы, структуры данных и атд
- •Время выполнения программы
- •Асимптотические отношения
- •Ограниченность показателя функции роста
- •Анализ программы на псевдоязыке
- •Абстрактный тип данных в списках
- •Реализация атд (Абстрактный тип данных). Линейный список
- •Сравнение последовательного и связанного распределения
- •Структуры данных на основе линейных списков Стек, очередь, дек
- •Реализация стека, дека и очереди на основе лсс (Линейного связанного списка)
- •Реализация дека
- •Не линейная структура данных атд дерево
- •Порядок узлов
- •Прямой, обратный и симметричный обход дерева
- •Помеченные деревья или деревья выражений
- •Сортировка
- •Классификация алгоритмов сортировки
- •Постановка задачи сортировки
- •Методы сортировок
- •Типы сортировок
- •Критерии оценки сортировок
- •Простые схемы сортировок
- •Простая вставка
- •Алгоритм Шелла
- •Быстрая сортировка Хоару
- •Оценка эффективности быстрой сортировки
- •Пирамидальная сортировка. Выбор из дерева
- •Сортировка подсчетом
- •Распределяющий подсчет
- •Класс сортировок слиянием
- •Естественное двухпутевое слияние – едс
- •Фиксированное двухпутевое слияние
- •Пример выполнения расчетов по практическому занятию
Методы сортировок
Методы сортировок описывают способ реализации перестановки записей (ключей):
Если записи небольшие, то можно осуществить их физическое переразмещение в памяти
Создать специальную таблицу, описывающую перестановку элементов, и обеспечивающую доступ к элементам, не двигая их так, чтобы в соответствии с упорядоченностью ключей. Перестановка P[i]=j массив перестановок P означает или реализует следующее: i-тая запись займет в ходе перестановки j-тое место. Ki (i=1..n) Result[p[j]] = R[j]
Если записи длинные, а ключи короткие, то для повышения скорости сортировки ключи можно вынести в таблицу ключей – сортировка ключей
Если сопутствующая информация и/или ключи занимают много байт памяти, то можно составить новую таблицу адресов, которая указывает на записи. Создаем ссылки и переразмещаем
В каждую запись добавляется специальное поле связи, образующее связанный список. Тогда сортировка заключается в изменении этих полей связи так (не переразмещая сами записи), чтобы линейный порядок обхода образовывал упорядоченную последовательность
Типы сортировок
Типы сортировок: внутренняя и внешняя.
Внутренняя предполагает хранение всех записей (исходных результирующих и т.д.) в оперативной памяти, причем в любой момент времени доступен любой элемент.
Внешняя сортировка – данные хранятся на внешнем медленном носителе, а в памяти хранится их подмножество, после операции, над которым данные помещаются обратно на внешнее ЗУ и считывается следующая порция данных.
Критерии оценки сортировок
Сравнить по количеству выполняемых операций.
Количество сравнений ключей
Заметим, что максимально возможное количество сравнений происходит в случае, когда каждый ключ сравнивается с каждым другим (попарное сравнение) N сравнений. Однако в бинарном поиске, где тоже сравнение, число сравнение равно log2 N. Так как нам надо расположить N ключей, то можно предположить, что трудоемкость сортировки (при условии времени доступа за O(1) ограниченным диапазоном).
N log2 N ≤ Ө сортировка ≤ N2
При этом наихудшее время N2 имеют алгоритмы, которые нерационально сравнивать. К таким алгоритмам относят пузырек, простую вставку, простой выбор.
Простые схемы сортировок
∑ j=1 |
Пузырек
For i:=1 to n-1 do For j:=n downto i-1 do begin If K[j]<K[j-1] then R[j] R[j-1] |
Простая вставка
R[1] – на месте For i:=2 to N do begin j:=i-1; R:=R[i]; while((j>0)and(k[j]<K)) do begin R[j++] R[j]; j--; end; R[j+1]:=R End;
|
Простой выбор
For i:=1 to N do begin nmin:=j; min:=K[j]; for(i:=j+1) to N do IF K[j]<min then begin Min:=K[j]; Nmin:=j; End; R[i] R[min]; End;
|
F(n)= ∑i=1n ∑j=1n 1=1+2+3+....+n = n/2(n+-1)=(n2+-n)/2
0(f(n))=max { n2/2; n/2 } = n2
Заметим, что наибольшее время будет затрачено в том случае, если кроме сравнений (попарных) будет выполнена максимальное количество обменов (сдвигов) записей. Это произойдет в случае пузырька, если самый минимальный элемент занял самое крайнее правое положение , а заодно итерацию внешнего цикла он смещается максимум на одну позицию влево. Улучшится ли время сортировки, если элементы сдвигать не на одну позицию, «скачками» перепрыгивая некоторые позиции, исключая промежуточные переприсваивания, сдвиги и т.д.