Довольно сложными методами, в изложение которых мы не будем углубляться, показано, что алгоритм Шелла имеет сложность ~N3/2. И хотя это несколько хуже, чем N*logN, все-таки эта сортировка относится к улучшенным.
Пример сравнения сортировок: Вновь возьмем последовательность, для сортировки которой методом простых вставок ПрВст потребовалось 15 сдвигов (25 пересылок и 20 сравнений):
5 3 4 3 6 2 1 Теперь применим к ней метод Шелла.
Здесь N = 7, поэтому:
t= trunc(log 7) = 2k= 22-1 = 3 {начнем с 3-сортировки}p= 7 mod 3 = 1 {кол-во длинных подпоследовательностей}s= (7 div 3)+1 = 3 {длина длинной подпоследовательности}1. 3-сортировки: 5 3 1 -> 1 3 5 {3 сдвига: 7 пересылок, 5 сравнений}3 6 -> 3 6 {0 сдвигов: 0 пересылок, 1 сравнение}4 2 -> 2 4 {1 сдвиг: 3 пересылки, 2 сравнения}2. Всего 4 сдвига: 10 пересылок, 8 сравнений Итог 3-сортировок: 1 3 2 3 6 4 5 3. 1-сортировка: Состояние массива Сдвиги Сравнения Пересылки данных0 шаг: 1323645 1 шаг: 1323645 0 1 02 шаг: 1323645 1 1+1 1+23 шаг: 1233645 0 1 04 шаг: 1233645 0 1 05 шаг: 1233645 1 1+1 1+26 шаг: 1233465 1 1+1 1+2результат: 1233456 3 9 9 При сортировке методом Шелла в сумме получилось 7 сдвигов (19 пересылок и 17 сравнений). Выигрыш по сравнению с методом простых вставок составляет 53% (24% экономится на пересылках и 15% - на сравнениях)2). Если вместо метода простых вставок ПрВст использовать метод бинарных вставок БинВст, то выигрыш по количеству сравнений будет ощутимее.
Кроме того, не нужно забывать, что в нашем примере последовательность очень коротка: N = 7. Для больших N (скажем, N = 10000) преимущество метода Шелла станет еще заметнее.