
- •Тема 3б. Улучшенные методы сортировки массивов
- •Из предыдущей лекции мы знаем, что
- •Улучшенные методы сортировки эффективность О(n log2n)
- •Идея метода Шелла
- •Идея пирамидальной сортировки
- •Сортировка с помощью дерева поиска
- •Сортировка слиянием
- •Напомним, что тип массива записей введен следующим образом
- •Процедура слияния двух отсортированных
- •Трассировка слияния
- •Рекурсивное разбиение на подзадачи
- •Рекурсивная процедура сортировки слиянием
- •Описание класса
- •Трассировка сортировки слиянием
- •Метод разделения Хоара
- •Процедура разделения
- •Трассировка разделения
- •Рекурсивное разделение на подзадачи
- •Трассировка
- •Нерекурсивный вариант (начало)
- •Нерекурсивный вариант (продолжение)
- •Рекомендации
- •Контрольные вопросы
- •Задачи на экзамен
- ••unit Unit2;
- ••implementation
- ••Procedure Tob.SortSlip;
- ••Procedure SrSL(L,R:word);
- ••procedure TForm1.Button1Click(Sender: TObject);
- •Обработка события «Изменение окна Edit3»
- •Пример оформления экзаменационной задачи
- •Задачи на экзамен
- ••unit Unit2;
- ••implementation
- ••Procedure Tob.QuickSort;
- ••unit Unit1;
- •Обработка события «Изменение окна Edit3»
- •Пример оформления экзаменационной задачи
- •Конец темы 3
Тема 3б. Улучшенные методы сортировки массивов
Основные направления улучшения методов сортировки
Метод слиянияМетод быстрой сортировки Хоара
Сравнение методов сортировки
07/02/19 |
1 |
Из предыдущей лекции мы знаем, что
Прямые методы внутренней сортировки можно разбить на три категории
– сортировка с помощью
прямого обмена,
прямого включения,
прямого выбора
Эффективность этих методов оценивается как
О(n2)
07/02/19 |
2 |
Оценим затраты на сортировку n=105 элементов n2=1010.
Допустим, производительность ПК 106 оп/с Следовательно ПК будет сортировать 104 с ~ 2.5 часа
Вопросы: 1) как придумать более быстрые алгоритмы? 2) какова их предельная эффективность?
Теория показывает, что для хаотически перемешанного массива предельная эффективность
|
О(n log2n) |
|
Много это, или мало? |
|
|
Оценим для n=105 |
|
|
n log2n=105log2105=1.7 106 |
|
|
Компьютер отсортирует наш массив |
3 |
|
07/02/19 |
за 1.7секунды!!! |
|
|
|
Улучшенные методы сортировки эффективность О(n log2n)
Никлаус Вирт, Род Стивенс
Метод Д.Шелла (1959) усовершенствование метода прямого включения.
Сортировка пирамидальная (с помощью дерева) метод HeapSort, Д. Уильямсон, (1964) усовершенствование метода прямого выбора.
Сортировка с помощью разделения, метод QuickSort, Ч. Хоар, (1962), улучшенная версия пузырьковой сортировки. На сегодняшний день это самый эффективный метод внутренней сортировки.
Сортировка слиянием (привлечение дополнительных массивов) Не уступает по скорости методу Хоара.
07/02/19 |
4 |

Идея метода Шелла
Основной недостаток метода включения в том, что приходится передвигать элементы находящиеся левее вставляемого
Шелл предложил для минимизации сдвигов производить сначала сортировки элементов, отстоящих друг от друга на 4 позиции, потом на 2 и наконец на одну
Четвертная сортировка 5 7 4 1 3 6 2 8
Двойная сортировка 3 6 2 1 5 7 4 8
Одинарная сортировка
07/02/19Результат
2 |
1 |
3 |
6 |
4 |
7 |
5 |
8 |
|
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
5 |

Идея пирамидальной сортировки
Массив представляется в виде пирамидальной структуры.
Нахождение минимального элемента и его перестановка производится не с первым элементом, а с элементом со следующего уровня
4 9 8 3 2 1 6 4 2 1 3 9 8 6 1 2 4 3 9 8 6
4 |
4 |
1 |
9 |
8 |
2 |
1 |
2 |
4 |
3 |
2 |
1 |
6 |
3 |
9 |
8 |
6 |
3 |
9 |
8 |
6 |
07/02/19 |
6 |

1 2 4 3 9 8 6 |
1 2 4 3 9 8 6 |
1 2 3 4 9 8 6 |
||||
|
2 |
|
|
4 |
|
4 |
|
4 |
3 |
3 |
9 |
9 |
8 |
|
|
|
||||
9 |
8 |
6 |
8 |
6 |
6 |
|
|
|
|
|
1 2 3 4 6 8 9
Массив 6 упорядочен
8 9
07/02/19 |
7 |

Сортировка с помощью дерева поиска
Строится пирамида в виде дерева поиска после этого производится обход этого дерева
4 2 8 3 9 1 6 |
4 |
|
2 8
1 |
3 |
6 |
9 |
07/02/19 |
8 |
Сортировка слиянием
является иллюстрацией того, каким образом за счет использования дополнительных рабочих массивов можно значительно повысить эффективность сортировки.
Идея метода основана на следующем эффективном алгоритме слияния.
Пусть внутри массива a[1..n] имеется два смежных
отсортированных участка (например, по возрастанию ключа) a[L, m], a[m+1,R] 1≤L<R≤n.
a1….aL...am, am+1...aR….an
Необходимо отсортировать весь участок a[L,R].
Процедура сортировки для этого участка организуется специфическим слиянием двух участков в один рабочий массив
07/02/19 |
C1…CR-L+1 |
9 |
Напомним, что тип массива записей введен следующим образом
• |
type |
|
|
|
• |
Tinf=<описать |
свой |
тип |
информации>; |
• |
Tk= <описать |
свой |
тип |
ключа>; |
•Tzp=record
• |
zp:Tinf;//поле информации |
• |
k:Tk;//поле ключа |
• |
end; |
•Mas=array[1..1] of Tzp;//Массив записей
•Tmas=^mas;
•Var a:Tmas;
•Begin
•n:=. . .;
•getmem(a,n*sizeof(Tzp));
07/02/19 |
10 |