- •1.Основные понятия эис
- •19. Классификация алгоритмов
- •Классификация Алгоритмов
- •20. Абстрактные типы данных (массивы, связанные списки, выделение памяти)
- •Абстрактные типы данных
- •Элементарные Структуры Данных
- •Массивы
- •Связанные списки
- •Выделение Памяти
- •21. Стеки, очереди, деревья
- •Очереди
- •Деревья
- •Терминология
- •22. Математические характеристики деревьев
- •Свойства
- •23. Обход деревьев
- •Обход Деревьев
- •Алгоритм быстрой сортировки
- •1 2 3 4 5 6 7
- •25. Критерии эффективности алгоритмов (формирование, поиск последовательного масиива)
- •26. Критерии эффективности алгоритма ступенчетого поиска
- •27. Сортировка методом Шелла Сортировка Шелла
- •28. Сортировка простым включением
- •29. Приоритетные очереди
- •30. Радикс сортировка Радикс Сортировка
- •Сортировка Радикс Обменом
- •Прямая Радикс Сортировка
- •Свойства Радикс Сортировок
- •31. Рекурсия Рекурсивные определения
- •Рекурсивные процедуры
- •Итерация и рекурсия
- •32. Рекурсивный обход деревьев, удаление рекурсии Рекурсивный Обход Дерева
- •Удаление Рекурсии
- •33. Элементарные методы сортировки и их характеристики Элементарные Методы Сортировки
- •Правила Игры
- •Сортировка Выбором
- •Сортировка Вставкой
- •34. Простейшие алгоритмы сортировки (методом пузырька, сортировка выбором, шейкер сортировка, ростировка Шелла), сравнение простых методов сортировки. Пузырьковая Сортировка
- •Характеристики Простейших Сортировок
- •Сортировка Файлов с Большими Записями
- •Сортировка Шелла
- •Подсчет Распределения
- •35. Алгоритмы быстрой сортировки, разрядная сортировка Алгоритм быстрой сортировки
- •1 2 3 4 5 6 7
- •36. Пирамидальная сортировка Пирамидальная сортировка
- •37. Сортировка слиянием (простое слияние, двухпутевое слияние, рекурсивный алгоритм слияния) Сортировка слиянием
- •Простое слияние
- •Y 1 2 3 4 5 6 7 8
- •Естественное двухпутевое слияние
- •Рекурсивный алгоритм слияния
Алгоритм быстрой сортировки
Алгоритм принадлежит Хоару (CharlesAntonyRichardHoare), который опубликовал и тщательно проанализировал его в 1962 году.
Суть алгоритма основана на обмене элементов с разделением, поэтому иногда его называют обменной сортировкой с разделением.
Выберем случайным образом какой-то элемент массива, обозначим его yи будем называть его опорным элементом. Проблема выбора опорного элемента будет рассмотрена отдельно.
Наша задача разделитьмассив на две части – левую, с элементами меньшимиyи правую с элементами большимиy. Будем просматривать массив с двух сторон. Двигаясь слева направо, найдем элементx[i]>y, а, двигаясь справа налево, найдем элементx[j]<y.Поменяем их местами и продолжим просмотр до тех пор, пока не встретимся в каком-то месте массива. Понятно, что после такого прохода массив будет разделен по принципу: слева стоят все элементы меньшие опорного, а справа – все элементы большие или равные.
Теперь тот же метод применим к левой и правой части, до тех пор, пока каждая часть не будет содержать только один элемент.
Пример разделения 1 (по Кормену): в качестве опорного элемента выбран y=x[1]=5:
5 |
3 |
2 |
6 |
4 |
1 |
3 |
7 |
3 |
3 |
2 |
6 |
4 |
1 |
5 |
7 |
3 |
3 |
2 |
1 |
4 |
6 |
5 |
7 |
Пример разделения 2 (по Вирту): в качестве опорного элемента выбран средний элемент y=42:
44 |
55 |
12 |
42 |
94 |
06 |
18 |
67 |
18 |
55 |
12 |
42 |
94 |
06 |
44 |
67 |
18 |
06 |
12 |
42 |
94 |
55 |
44 |
67 |
Пример разделения 3 (по Кнуту-Седгевику): в качестве опорного элемента выбран первый элемент y=50, просмотр начинается со 2 элемента, затем происходит обменjэлемента с 1
:
50 |
8 |
51 |
98 |
42 |
15 |
67 |
73 |
50 |
8 |
15 |
98 |
42 |
51 |
67 |
73 |
50 |
8 |
15 |
42 |
98 |
51 |
67 |
73 |
48 |
8 |
15 |
50 |
98 |
51 |
67 |
73 |
{Partition
по Вирту}
i
:= 1; j := n; {выбор
опорного элемента
y};
repeatwhilex[i] < ydoi
:= i + 1;whilex[j] > ydoj :=j – 1;ifi<= jthenbegin
z := x[i]; x[i] := x[j];
x[j] := z;
i :=i + 1; j := j – 1end;untili > j;
В рассмотренном примере 1 разделения массива, после завершения разделения значения индексов равны: i = 6,j = 5. Заметим, что условиеifi<=jthenпредшествующее обмену необходимо – без него мы ошибочно бы обменяли местами 4 и 6.
В рассмотренном примере 2 разделения массива, после завершения разделения значения индексов равны: i = 5,j = 3.
Все элементы разделились по принципу:
x[k]<=y, k=1,…i-1;
x[k]>=y, k=j+1,n,
x[k]=y,k=j+1,…i-1.
Рассмотрим теперь разделение массива:
2 |
3 |
7 |
1 |
6 |
5 |
4 |
1 |
3 |
7 |
2 |
6 |
5 |
4 |
После завершения разделения значения индексов равны: i = 2,j = 1. Здесь выбор среднего элемента в качестве опорного является неудачным, так как после деления имеем разбиение на левую часть из 1 элемента и правую часть из (n-1) элемента.
С тем же успехом, можно выбирать в качестве опорного первый или последний элементы массива, которые тоже дадут плохой вариант для предварительно отсортированных массивов.