Эффективность алгоритма УлШелл
Довольно сложными методами, в изложение которых мы не будем углубляться, показано, что алгоритм Шелла имеет сложность ~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) преимущество метода Шелла станет еще заметнее.