
- •Вопрос 57: Пользовательские типы данных. Тип struct. Массивы структур.
- •Вопрос 58: Объединения (union). Битовые поля.
- •Сложность этой программы о(n2). Сложность ниже приведенного алгоритма o(n3).
- •Вопрос 60: Алгоритмы сортировки и поиска. Обменные сортировки. Сортировки вставками. Сортировки выбором. Сравнительный анализ методов сортировки.
- •2. Алгоритмы сортировки
- •2.1. Обменные сортировки
- •2.1.1. Метод пузырька
- •2.1.2. “Быстрая сортировка” или обменная с разделением
- •2.1.3.Шейкерная сортировка
- •2.2. Сортировка вставками
- •2.3 Сортировка выбором
- •В этом алгоритме использована дополнительная память. При экономии памяти алгоритм будет следующий:
- •Выбор метода сортировки
2.1.3.Шейкерная сортировка
-
Предположим, мы упорядочиваем массив в порядке возрастания. После первого прохода "Пузырьком", самый большой
элемент массива встанет на свое место. Выполним второй проход наоборот, от предпоследнего элемента до первого.
После этого прохода встанет на свое место самый маленький элемент. Так и будем выполнять наши проходы массива:
нечетные слева - направо и четные справа - налево.
При этом на нечетных проходах будет занимать свое место самый большой элемент (из оставшихся), а при нечетных
самый маленький (также из оставшихся).
Алгоритм
Левая граница = Номер первого элемента
Правая граница = Номер последнего элемента
Пока Левая граница < Правой границы делать
Прямой проход "Пузырька" от Левой границы до Правой-1
Правая граница = Правая граница - 1
Обратный проход "Пузырька" от Правой границы до Левой+1
Левая граница = Левая граница + 1
Таблица 2.4. Пример шейкерной сортировки
Начальное состояние массива
8 23 5 65 44 33 1 6
Шаг 1
8 23 5 65 44 33 1 6
8 23 5 65 44 1 33 6
8 23 5 65 1 44 33 6
8 23 5 1 65 44 33 6
8 23 1 5 65 44 33 6
8 1 23 5 65 44 33 6
1 8 23 5 65 44 33 6
Шаг 2
1 8 23 5 65 44 33 6
1 8 5 23 65 44 33 6
1 8 5 23 65 44 33 6
1 8 5 23 44 65 33 6
1 8 5 23 44 33 65 6
1 8 5 23 44 33 6 65
Шаг 3
1 8 5 23 44 6 33 65
1 8 5 23 6 44 33 65
1 8 5 6 23 44 33 65
1 8 5 6 23 44 33 65
1 5 8 6 23 44 33 65
Шаг 4
1 5 6 8 23 44 33 65
1 5 6 8 23 44 33 65
1 5 6 8 23 44 33 65
1 5 6 8 23 33 44 65
Шаг 5
1 5 6 8 23 33 44 65
1 5 6 8 23 33 44 65
1 5 6 8 23 33 44 65
2.2. Сортировка вставками
Элементы просматриваются по одному, и каждый новый элемент вставляется в подходящее место среди ранее упорядоченных элементов.
Пример применения простых вставок.
25 15 17 22 03 06 08 09 21 19 01
^25: 15
15^25 : 17
15 17^25 : 22
^15 17 22 25 : 03
03^15 17 22 25 : 06
03 06^15 17 22 25 : 08
03 06 08^15 17 22 25 : 09
03 06 08 09 15 17^22 25 : 21
03 06 08 09 15 17^21 22 25 : 19
^0З 06 08 09 15 17 19 21 22 25 : 01
01 03 06 08 09 15 17 19 21 22 25
При сортировке простыми вставками ключ j-ой записи в среднем сравнивается с j/2 ранее отсортированными ключами.
Рассмотрим алгоритм без использования дополнительной памяти.
Алгоритм:
Р1. [Цикл по j.] Выполнить шаги P2-P5 при j=2,3,…,N. После этого завершить работу алгоритма.
P2. [Установить i,K,R.] i:=j-1, K:=Kj, R:=Rj.
P3. [Сравнение K с Ki.] Если K > Ki, то перейти к P5 (нашли искомое место для записи R).
P4. [ Переместить Rj, уменьшить i.] Установить Ri+1:= Ri, i:=i-1.
Если i>0, то вернуться к шагу P3. Если i=0, то K наименьший из рассмотренных ключей и запись R тогда должна занять 1-ую позицию.
P5. [R на место Ri+1] Ri+1:= R.
В этом алгоритме запись Rj как бы “проникает на положенный ей уровень”, поэтому его еще называют просеиванием или погружением.
Число сравнений ≈N2/4.