Как выполнить сортировку оболочки, используя последовательность {3,2,1}? - PullRequest
0 голосов
/ 05 марта 2020

Предположим, у меня есть массив:

30 20 29 19 28 18 27 17 26 16 25 15 24 14 23 13 22 12 21 11

Я не понимаю, как выполнить сортировку оболочки, используя последовательность 3: я бы просто сделал это:

30 20 29 19 28 18 27 17 | 26 16 25 15 24 14  |23 13 22 12 21 11

Где я делю это на 3 части и сортировать соответствующие части? А потом сделать то же самое с 2-й сортировкой после, кроме разбиения на половинки? Как правильно это сделать? Может кто-нибудь объяснить, пожалуйста?

1 Ответ

2 голосов
/ 05 марта 2020

Если вы посмотрите на свой массив и пронумеруете местоположения

1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20
30 20 29 19 28 18 27 17 26 16 25 15 24 14 23 13 22 12 21 11

При сортировке оболочки вы начинаете с номера пропуска (в вашем случае 3), чтобы составить первый «список» Вы берете номер и пропускаете. С 3 это будет 1-й, 4-й, 7-й и т. Д. c.

. Таким образом, у вас будет список

1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20
30       19       27       16       24       13       21 

и второй список

1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20
   20       28       17       25       14       22       11

3-й список - это оставшиеся предметы.

Для следующего раунда вы делаете это на один меньше ... так что предметы в нечетных местах и ​​предметы в четных местах.


В ответ на комментарий ниже

Сортировка оболочки - это сортировка на месте - это означает, что вы не удаляете элементы в новые списки или не создаете новые структуры данных. Вы используете массив, чтобы «обрабатывать» элементы, которые «далеко друг от друга» с точки зрения расположения массивов, как рядом друг с другом. На самом деле вы не создаете новые списки или новые массивы (именно поэтому я показывал свои диаграммы так же, как и я); Вы просто смотрите на эти места.

Почему?

Потому что это означает, что когда вы начинаете (например, с 3), вы перемещаете вещи дальше) - например, 13, который начинается в местоположении 16 перемещается в местоположение 1 в первом проходе. Затем, когда вы уменьшаете число, вы начинаете делать больше локальных изменений. Это означает, что вы получаете преимущество над типичной пузырьковой сортировкой. Все еще не хорошо - но НАМНОГО лучше чем пузырьковая сортировка.

...