
Оч ← пусто
для j от 0 до m-1 делать Q[j] ← ПУСТО
для l от lmax до 1
делать
присоединить ДЛ[l] к началу ОЧ
пока ОЧ ≠ ПУСТО
делать
пусть Аi – первая цепочка в списке ОЧ
Q[ail] ← Аi
для j ← НЕПУСТ[l]
делать
присоединить Q[j] к концу ОЧ
Q[j] ← ПУСТО
Например:
Даны цепочки a, bab, abc.
-
Цепочка указателей
Данные
1
a
3
b
a
b
3
a
b
0
c
Первый шаг:
-
a
–
(1, a)
bab
–
(1, b); (2, a); (3, b)
abc
–
(1, a); (2, b); (3, c)
(1, a); (1, a); (1, b); (2, a); (2, b); (3, b); (3, c)
НЕПУСТ[1] ← a, b
НЕПУСТ[2] ← a, b
НЕПУСТ[3] ← b, c
Второй шаг:
ДЛ[1] ← а
ДЛ[2] ← ПУСТО
ДЛ[3] ← bab, abc.
Третий шаг:
ОЧ = bab, abc.
Располагаем цепочки по их третьей компоненте. Равенство НЕПУСТ[3] = b, c гарантирует, что построении упорядоченного списка в соответствии с алгоритмом не обязательно присоединять Q[а] к концу списка ОЧ.
l=3 ОЧ = bab, abc
l=2 ОЧ = bab, abc
l=1 ОЧ = а, abc, bab
При третьем прохождении Q[с] не надо присоединять к концу списка, т.к. НЕПУСТ[1] не содержит с.
Результат: а, abc, bab
Задание.
Написать алгоритмы разобранных сортировок.
Изучить самостоятельно метод Шелла.
Разобраться в этапах сортировки слиянием.