- •Саод, семестр 1
- •Абстрактные типы данных
- •Типы, структуры данных и атд
- •Время выполнения программы
- •Асимптотические отношения
- •Ограниченность показателя функции роста
- •Анализ программы на псевдоязыке
- •Абстрактный тип данных в списках
- •Реализация атд (Абстрактный тип данных). Линейный список
- •Сравнение последовательного и связанного распределения
- •Структуры данных на основе линейных списков Стек, очередь, дек
- •Реализация стека, дека и очереди на основе лсс (Линейного связанного списка)
- •Реализация дека
- •Не линейная структура данных атд дерево
- •Порядок узлов
- •Прямой, обратный и симметричный обход дерева
- •Помеченные деревья или деревья выражений
- •Сортировка
- •Классификация алгоритмов сортировки
- •Постановка задачи сортировки
- •Методы сортировок
- •Типы сортировок
- •Критерии оценки сортировок
- •Простые схемы сортировок
- •Простая вставка
- •Алгоритм Шелла
- •Быстрая сортировка Хоару
- •Оценка эффективности быстрой сортировки
- •Пирамидальная сортировка. Выбор из дерева
- •Сортировка подсчетом
- •Распределяющий подсчет
- •Класс сортировок слиянием
- •Естественное двухпутевое слияние – едс
- •Фиксированное двухпутевое слияние
- •Пример выполнения расчетов по практическому занятию
Быстрая сортировка Хоару
В методе пузырька последовательность сравнений предопределена и на следующем шаге мы не используем ту информацию, которую могли бы извлечь из сравнений этого шага.
Рассмотрим стратегию, которая это использует.
2 6 7 10 8 1 5 7
1 2
2 6
|
5 6 7 8 10
1 2 5 6 7 8 10
i j
i=left =1 j=right=8
начинаем сравнивать i j элементы.
Если левый i-тый элемент оказался неупорядочен относительно правого, т.е. j – они меняются местами. После обмена начинает увеличиться i или уменьшаться j, та, которая не изменялась до обмена., а другая замораживается до следующего обмена. Стадия завершается в случае j=i . Рассмотрим эту ситуацию.
В этот момент слева от этой позиции отсутствуют элементы, превышающие, а справа отсутствуют элементы меньшие. Что в каждом сравнении использовался первый элемент, который назовем опорным. Опорный элемент занял свой окончательное положение в сортируемой последовательности (т.к. слева нету элементов больших, а справа - меньших). К каждой из двух под последовательностей (левую и правую относительно опорного) можно применить ту ж процедуру. Рекурсивно применим данную процедуру до тех пор, пока right-left > 2
Procedure quicksort(left,right:integer);
Var j,i:integer;
Begin i:=left; J:=right;
Repeat
While (i<j) K[i] < K[j] do j--;
If i<j then R[i] R[j];
If i<j then
While(i<j) and (k[i] < k[j] ) do i++;
If i<j then r[i] R[j];
Until i=j;
If (i-left) > 1 then quicksort(left,i-1);
If (right-j) > 1 then quicksort(i+1,right);
End;
Begin quciksort();
Оценка эффективности быстрой сортировки
Опорный элемент делит последовательность в идеале почти пополам. Каждый из образовавшихся подпоследовательностей данного уровня иерархии рекурсивного вызова применяется тот же самый алгоритм так, в сумме по последовательностям quicksort обеспечивает встречное движение, а точнее всех переменных. Если последовательность упорядочена в обратном порядке, то опорный элемент, занимается крайнее левое или правое положение разбивает, обеспечивая максимальное количество число уровней глубины рекурсии n - 1, на каждом уровне просматривая N элементов. Таким образом, худшая оценка достигается в случае упорядоченности в подпоследовательности данных. Все алгоритмы по улучшению данных алгоритма Хоару сводится к выбору специальным образом опорного элемента так, чтобы разбиение по возможности происходило на середине отрезка.
Популярен алгоритм, в котором индекс опорного элемента получил название pivot.
Pivot:=(right-left) / 2 + left;
Все сравнения вида while k[i] > k[[j] k[pivot]>k[i]
k[pivot] < k[j];