Выбор последовательности шагов для алгоритма сортировки Шелла

Бесплатный доступ

В работе приведены результаты эмпирического исследования нескольких последовательностей шагов для алгоритма сортировки Шелла. Показана достаточно высокая эффективность таких последовательностей в сравнении с другими, хорошо известными последовательностями.

Сортировка, сортировка шелла

Короткий адрес: https://sciup.org/14127897

IDR: 14127897

Текст научной статьи Выбор последовательности шагов для алгоритма сортировки Шелла

Sychov P. P. Choosing a sequence of steps for the Shell sorting algorithm. System analysis in science and education, 2023;(1):41–45 (in Russ). Available from:

Алгоритм сортировки Шелла ( ShellSort ) предложен в 1959 году [1] и занимает промежуточное положение между «медленными» алгоритмами сортировки с временной сложностью O(N2^, где N - размер сортируемого массива ( InsertSort , BubbleSort и т.д.) и «быстрыми» алгоритмами с временной сложностью O(NlogN) ( Quicksort, SortMerge и другие). Обычно временную сложность алгоритма ShellSort определяют как: O(NK) где 1 < а< 2. Значение к зависит от выбора шагов алгоритма.

Алгоритм Шелла состоит в последовательном применении алгоритма сортировки вставками (InsertSort) с уменьшающемся шагом. Т.е. задается последовательность шагов (hm hm-1 … h1 ) такая что h1=1 и hk > hk-1. Массив, отсортированный с шагом p называется p-упорядоченным, т.е. все элементы этого массива, отстоящие друг от друга на расстояние, кратное p, упорядочены. Показано, что если р-упорядоченный массив отсортировать с шагом q, он останется p-упорядоченным, то есть он будет од- новременно и p и q-упорядоченным. Поэтому к последней сортировке с шагом 1 массив уже значительно упорядочен и сложность последнего этапа будет пропорциональна N, а общая сложность алгоритма – лучше, чем N2.

Хорошо изучены только некоторые последовательности шагов [2]. Генерация шагов можно производить либо по убыванию шагов, либо по их увеличению. Самый большой шаг должен быть сравним с размером массива, около N /2, чтобы на первом шаге сортировки в каждом подмножестве было только 2-3 элемента.

Методика

Для измерения характеристик различных последовательностей шагов была реализована функция сортировки массива целых чисел алгоритмом Шелла. Кроме массива чисел для сортировки в эту функцию передавался массив шагов, который использовался в алгоритме. Этот массив шагов готовился отдельно, в соответствии с выбранным алгоритмом генерации шагов, его размер зависел от размера сортируемого массива. Шаги располагаются в убывающем порядке.

Для каждого алгоритма генерации шагов сортировки генерировалось несколько массивов целых чисел разного размера, заполненных псевдослучайными значениями. Известно, что последовательность псевдослучайных чисел, генерируемых тем или иным генератором псевдослучайных чисел, полностью определяется начальным значением этого генератора. Чаще всего, в реальных программах, он инициируется текущим значением таймера, но его всегда можно задать явно. В нашем случае, для каждой серии прогонов использовалась одна и та же последовательность начальных значений.

Измерения

В таблице 1 приведены результаты тестовых прогонов программы для «медленных» последовательностей шагов. В первой строке приводится размер массива, в первом столбце – алгоритм генерации шагов. Элементы таблицы – усредненное по серии прогонов время работы функции сортировки для данного массива и данного набора шагов сортировки, округленное до целого числа миллисекунд.

Таблица 1. Результаты тестовых прогонов

Алгоритм

1000

2000

5000

10000

20000

50000

Линейный коэффициент

InsertSort

13

46

272

1092

4350

27131

1.97

hk = 2k

1

3

11

31

81

407

1.46

hk = 3k

1

3

11

36

77

262

1.46

Если временную сложность алгоритма ShellSort представить в виде t = CNa , то логарифмируя это выражение получим logt = logC + alogN. Т.е. точки ( log t, log N ) должны аппроксимироваться прямой. Коэффициент ее наклона и будет представлять временную сложность в этом эксперименте. Коэффициент вычислялся по методу наименьших квадратов.

Рис. 1. График зависимости десятичного логарифма времени сортировки от размера массива

На рис. 1 приведен график зависимости десятичного логарифма времени сортировки от размера массива. Красный цвет соответствует обычной сортировке вставками, зеленый – последовательности шагов – степеней двух. График для последовательности шагов степеней трех не приводится, он практически совпадает с зеленым].

Временная сложность алгоритма сортировки вставками равна O(N2) , что согласуется с результатом в таблице 1. Средняя временная сложность для двух других алгоритмов тоже известна и равна 3

O(N 2 ) [2], что тоже соответствует результату в таб.1. Она относительно велика, так как последовательные шаги кратны друг другу, и при их использовании происходит слияние предыдущих подпоследовательностей, а не их перемешивание

Широко известные и часто используемые последовательности шагов приведены в таблице 2.

Таблица 2. Последовательности шагов

Алгоритм

104

2 * 104

5 * 104

105

2 * 105

5 * 105

106

2 * 106

Коэфф.

» к = 2 к

14

30

90

200

460

1372

3190

7071

1.18

N h k = 3 к

12

25

67

156

393

1084

2420

5504

1.17

Fibbo

16

35

100

230

541

1702

3902

8716

1.20

Sedgewick

10

22

60

131

270

731

1590

3363

1.09

Третий алгоритм в табл.2 – числа Фибоначчи, где очередной шаг равен сумме двух предыдущих, первые два равны 1 и 2.

Ряд нетривиальных последовательностей шагов предложено и изучено в работах [2,3,4]. Самой

лучшей, из известных на сегодня, является последовательность шагов, предложенная Седгевиком [4].

^ к

(     9 (2к(   8 • 2к —

-

2^

+ 1, если к — четное

6 • 2(к+1)/2 + 1, если к нечетное

Средняя временная сложность для этой последовательности равна О(М б ) [4]. Результаты приведены в последней строке таблицы 2. На рисунке 2 приведены графики для последовательности 2 (на легенде графика – Div 3) и последовательности шагов Седгевика.

Рис. 2. Графики для последовательности 2

Рассмотрим последовательности, генерируемые формулой hk+1 = L^hkJ + 1, где a - некоторая действительная константа. Через L%J обозначена операция извлечения целой части числа. В таблице 3 приведены результаты прогонов для некоторых значений параметра а.

Таблица 3. Результаты прогонов

Параметр

104

2 * 104

5 * 104

105

2 * 105

5 * 105

106

2 * 106

Коэфф.

1.9

11

24

66

144

297

802

1738

3593

1.09

2.0

12

28

85

185

432

1267

2690

7192

1.17

2.1

10

22

61

132

283

754

1547

3356

1.09

2.3

9

20

59

127

282

743

1633

3387

1.09

2.5

10

22

60

130

271

736

1619

3421

1.10

Хорошо видно, что за исключением целочисленного значения a = 2, результаты вполне сравнимы с последовательностью Седгевика. График не приводится, так как эти линии почти сливаются.

Другая интересная последовательность шагов генерируется формулой hk+1 = L^hkJ. где a – некоторая действительная константа. В таблице 4 приведены результаты для этой последовательности при разных значениях параметра a.

Таблица 4. Результаты

Параметр

104

2 * 104

5 * 104

105

2 * 105

5 * 105

106

2 * 106

Коэфф.

2.1

11

24

65

138

287

784

1641

3515

1.09

2.3

10

22

63

134

289

771

1690

3511

1.09

2.5

10

23

62

135

283

787

1705

3638

1.11

2.7

11

22

61

127

274

755

1652

3447

1.09

И последняя серия шагов, порождаемая формулой h

k+i = ^", hi = , где p, q - некоторые целые q           2

константы.

Таблица 5. Результаты

Параметры

104

2 * 104

5 * 104

105

2 * 105

5 * 105

106

2* 106

Коэфф.

p=13 q=31

10

22

60

132

282

750

1622

3544

1.09

p=15 q=31

11

23

62

135

286

754

1610

3418

1.09

p=17 q=31

11

24

68

138

297

785

1680

3551

1.09

p=19 q=31

12

25

68

146

302

847

1775

3752

1.10

Видно, что эти серии показывают очень неплохие результаты в рассмотренных условиях.

Результаты

Рассмотренные семейства шагов сортировки для алгоритма сортировки Шелла показывают хорошие результаты в практических тестах. Сами формулы для этих серий гораздо проще, чем, например, серия Седгевика. Однако, нужно отметить, что эти серии теоретически не изучены, и средняя сложность для них получена только эмпирически.

Список литературы Выбор последовательности шагов для алгоритма сортировки Шелла

  • Shell D. L. A high speed sorting procedure.Communications of the ACM. 1956. T. 2. № 7. С. 30-32.
  • Кнут, Д. Искусство программирования. Т 3: Сортировка и поиск. 3-е издание. Mосква: Вильямс, 2017.
  • Plaxton C. Greg, Suel Torsten. Lower Bounds for Shellsort. Journal of Algorithms. 1997. T. 23. № 2. C. 221-240.
  • Sedgewick R. A New Upper Bound for Shellsort. Journal of Algorithms. 1986. T. 7. № 2. С. 159-173.
Статья научная