Эффективность алгоритма УлШелл

 

Довольно сложными методами, в изложение которых мы не будем углубляться, показано, что алгоритм Шелла имеет сложность ~N3/2. И хотя это несколько хуже, чем N*logN, все-таки эта сортировка относится к улучшенным.

 

Пример сравнения сортировок:

 

Вновь возьмем последовательность, для сортировки которой методом простых вставок ПрВст потребовалось 15 сдвигов (25 пересылок и 20 сравнений):

 

5 3 4 3 6 2 1

 

Теперь применим к ней метод Шелла.

 

Здесь N = 7, поэтому:

 

t= trunc(log 7) = 2

k= 22-1 = 3 {начнем с 3-сортировки}

p= 7 mod 3 = 1 {кол-во длинных подпоследовательностей}

s= (7 div 3)+1 = 3 {длина длинной подпоследовательности}

3-сортировки:

5 3 1 -> 1 3 5 {3 сдвига: 7 пересылок, 5 сравнений}

3 6 -> 3 6 {0 сдвигов: 0 пересылок, 1 сравнение}

4 2 -> 2 4 {1 сдвиг: 3 пересылки, 2 сравнения}

Всего 4 сдвига: 10 пересылок, 8 сравнений

Итог 3-сортировок: 1 3 2 3 6 4 5

 

1-сортировка:

 

Состояние массива Сдвиги Сравнения Пересылки данных

 

0 шаг: 1323645

1 шаг: 1323645 0 1 0

2 шаг: 1323645 1 1+1 1+2

3 шаг: 1233645 0 1 0

4 шаг: 1233645 0 1 0

5 шаг: 1233645 1 1+1 1+2

6 шаг: 1233465 1 1+1 1+2

результат: 1233456 3 9 9

 

При сортировке методом Шелла в сумме получилось 7 сдвигов (19 пересылок и 17 сравнений). Выигрыш по сравнению с методом простых вставок составляет 53% (24% экономится на пересылках и 15% - на сравнениях). Если вместо метода простых вставок ПрВст использовать метод бинарных вставок БинВст, то выигрыш по количеству сравнений будет ощутимее.

 

Кроме того, не нужно забывать, что в нашем примере последовательность очень коротка: N = 7. Для больших N (скажем, N = 10000) преимущество метода Шелла станет еще заметнее.