166
а минимальное, среднее и максимальное число перемещений элементов равно
соответственно
M
min
= 0,
M
ср
= 3(n
2
- n)/2,
M
max
= 3(n
2
- n)/4.
Резюме: «обменная сортировка» представляет собой нечто среднее между
сортировками с помощью включений и с помощью выбора; фактически в
пузырьковой сортировке нет ничего ценного, кроме привлекательного названия.
Далее мы рассмотрим улучшенные методы сортировки.
§4.9. Сортировка включениями с убывающим приращением
В 1959 г. Д. Шеллом было предложено усовершенствование сортировки с
помощью прямого включения.
Сам метод сортировки объясняется и
демонстрируется на стандартном примере (см. рис. 4.9.1). Сначала отдельно
группируются и сортируются элементы, отстоящие друг от друга на 4 позиции.
Такой процесс называется четвертной сортировкой. В нашем примере восемь
элементов каждая группа состоит ровно из двух элементов. После первого
прохода элементы перегруппировываются — теперь каждый элемент группы
отстоит от
другого на две позиции — и вновь сортируются. Это называется
двойной сортировкой. Наконец, на третьем проходе идет обычная сортировка.
Сначала может показаться, что необходимость нескольких проходов
сортировки, в каждом из которых участвуют все элементы, потребует большего
количества машинных ресурсов, чем обычная сортировка. Однако на каждом
этапе либо сортируется относительно мало элементов
, либо элементы уже
довольно хорошо упорядочены и требуется сравнительно немного перестановок.
Ясно, что такой метод в результате дает упорядоченный массив, и, конечно
же, сразу видно, что каждый проход от предыдущих только выигрывает (так как
каждая i-сортировка объединяет две группы, уже отсортированные 2i-
сортировкой). Так же очевидно, что расстояния в группах можно
уменьшать по-
разному, лишь бы последнее было единичным, ведь в самом плохом случае
последний проход и сделает всю работу.
Функция сортировки Шелла
void shellSort(int numbers[], int array_size)
{
int i, j, increment, temp;
increment = 3;
while (increment > 0)
{
for (i=0; i < array_size; i++)