1

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

Насколько я понимаю, алгоритм сортировки слияния имеет 2 основных шага. Разделение и слияние. Я думал, что если вы дадите слияние сортировать массив из 100 слотов, он фактически создает новые массивы, поскольку он разбивается по середине от 100> 50/50> 25/25> 12/13> 6/5> 3/3> 1/1 , После всех этих расщеплений в этой точке у него есть 12 или 13 массивов в памяти. И затем, когда он, наконец, копирует их все в новые массивы из 1> 2> 3 или 4> 6> 12> 25> 50> 100.

Это еще 8 массивов (грубо говоря).

Но в учебниках я читаю такие вещи, как это:

Вы можете задаться вопросом, где все эти Подмассивы расположены в памяти. В алгоритме массив рабочих пространств того же размера, что и исходный массив, создан . Subarrays хранятся в разделах массива рабочей области. Это означает, что подмассивы в исходном массиве копируются в соответствующие места в массиве рабочей области. После каждого слияния массив рабочих пространств копируется обратно в исходный массив.

- Структуры и алгоритмы в Java Data Роберт Лафоре

+0

Вы можете реализовать сортировку слияния на месте: http://stackoverflow.com/q/2571049/ 3788176. Или нет. Таким образом, количество создаваемых массивов зависит от реализации. –

+1

Эти комментарии не дают достаточно подробностей. Конечно, это зависит от реализации. Но предположим, что это не сортировка слияния (Rocket Science). Это основная сортировка слияния в CS101, затем сколько массивов создается? – Doublespeed

ответ

1

Рассмотрим пару заключительных этапов типичной реализации сортировки слиянием. Нам нужны два массива - основной и вспомогательный, а также объединить подмассивы из массива aux в основной.

перед началом этапа слияния (|) обозначает начало каждой части массива (начальный индекс)) - мы объединяем подмассив с подматрицей B для заполнения первой половины целевого массива и слияния C-подмассива с субарером D для заполнения второго половина массива назначения:

Auxiliary array: |AAAA|BBBB|CCCC|DDDD 
Main array:  .................. 

после слияния (я использую произвольное упорядочение)

Auxiliary array: ............... 
Main array:  ABBABBAADCDDCCDC 

после копирования, до окончательного слияния

Auxiliary array: |ABBABBAA|DCDDCCDC 
Main array:  ................ 
+0

Итак, это действительно только 2 массива? Я имею в виду рекурсивный подход к сортировке слияния. Итак, тот же массив передается рекурсивным вызовам или Merge-sort и Merge()? – Doublespeed

+0

Да, только 2 массива. Посмотрите на первый код здесь: https://en.wikipedia.org/wiki/Merge_sort#Top-down_implementation - массивы A и B (целевым массивом фазы слияния является aux B) – MBo

0

Даже если вы «сплит» ваш массив не нужно создать 2 новых массивов. У вас всегда есть такое же количество слотов (здесь 100, даже если это 50 * 2 или 25 * 4 ...)

Вы просто перемещаете данные в нужное место в массиве (после первого разделения 50 первые слоты являются первым массивом, а 50 последних слотов являются вторым массивом)

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

0

В этом учебном пособии рассматриваются разумно эффективные реализации слияния, когда выполняется одноразовое распределение массива рабочей области того же размера, что и исходное. После этой точки все подмассивы, которые должны быть объединены, являются частями либо массива рабочей области, либо исходного массива, доступного через индексы (или указатели).

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