Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции_ по алгоритм и структуре.doc
Скачиваний:
56
Добавлен:
07.08.2019
Размер:
1.34 Mб
Скачать

Улучшенные методы сортировки. Сортировка шелла. Её эффективность. Сортировка шелла

Сортировка шелла базируется на алгоритме прямой вставки. Исходный массив своеобразным образом разбивается на части, которые и сортируются многократно алгоритмом прямого включения. Эти разбиения помогают сократить количество перестановок, так как чтобы освободить нужное место для очередного элемента, необходимо сдвигать меньше элементов.

Принцип работы сортировки шелла и необходимые расчёты для её реализации

Необходимо на каждом шаге произвести определённые действия, если t – это переменная, которая хранит номер этого шага. Сначала определяются все подпоследовательности, в которых расстояния между элементами равно kt. Далее каждая из этих подпоследовательностей сортируется методом прямого включения.

Сложным и важным местом данного алгоритма является нахождение убывающей последовательности расстояний kt, kt-1..., k1. Она должна обладать определёнными свойствами:

1) k1 = 1;

2) kt > kt-1 для всех t;

3) kt не должны быть кратными друг другу (это для того, чтобы не повторялась обработка ранее отсортированных элементов).

Дональд кнут предложил две последовательности расстояний:

  1. 1, 4, 13, 40, 121, …, т.е. Kt = 1+3*kt-1;

  2. 1, 3, 7, 15, 31, …, т.е. Kt = 1+2*kt-1 = 2t - 1.

Первая последовательность расстояний подходит для сортировок достаточно длинных массивов, а вторая подходит для коротких массивов.

Пример расчёта последовательности расстояний для малых массивов

Для удачного подбора значений необходимо, чтобы длина массива n попадала в такие границы

Kt <= n -1 < kt+1 или 2t <= n < 2t+1. (14.1).

Если прологарифмировать (14.1) по основанию 2, то можно получить следующее уравнение:

T <= log n < t+1. (14.2).

Далее из (14.2) получаем:

T = trunc(log n). (14.3).

Если используется язык программирования, в котором можно логарифмировать только по основанию е (натуральный логарифм), то необходимо применить знакомое из курса средней школы правило «превращения» логарифмов: logmx =logzx/logzm, где в нашем случае m = 2, z = e. Тогда выражение (14.3) будет иметь вид:

T= trunc(ln(n)/ln(2)). (14.4)

Если посчитать t по формулам (12.3), (12.4), то часть подпоследовательностей будет иметь длину 2, а часть – и вовсе 1. Сортировать такие подпоследовательности незачем, поэтому стоит сразу же отступить еще на 1 шаг. Тогда, можно записать окончательное выражение для числа шагов:

T= trunc(ln(n)/ln(2))-1. (14.5)

Тогда расстояние между элементами, т.е. Шаг, в любой подпоследовательности вычисляем таким образом:

K= 2t-1 или k= (1 shl t)-1. (14.6)

Количество подпоследовательностей, которые необходимо будет отсортировать прямой вставкой, для рассматриваемого шага будет равна k.

Далее необходимо определить, сколько элементов будет входить в каждую подпоследовательность. Если длину всей сортируемой последовательности n можно разделить на шаг k без остатка, тогда все подпоследовательности будут иметь одинаковую длину, а именно

S = n div k. (14.7)

Если же n не делится на шаг k нацело, то первые р подпоследовательностей будут длиннее на единицу. Количество таких подпоследовательностей равно остатку от деления n на шаг k:

P = n mod k. (14.8)