Я делаю проект «Один». Проблема заключается в следующем: создать алгоритм сортировки слияния с использованием рекурсии. Далее модифицируются из чьего-то решения:Алгоритм сортировки с использованием рекурсии
def merge_sort(arry)
# kick out the odds or kick out of the recursive splitting?
# I wasn't able to get the recombination to work within the same method.
return arry if arry.length == 1
arry1 = merge_sort(arry[0...arry.length/2])
arry2 = merge_sort(arry[arry.length/2..-1])
f_arry = []
index1 = 0 # placekeeper for iterating through arry1
index2 = 0 # placekeeper for iterating through arry2
# stops when f_arry is as long as combined subarrays
while f_arry.length < (arry1.length + arry2.length)
if index1 == arry1.length
# pushes remainder of arry2 to f_arry
# not sure why it needs to be flatten(ed)!
(f_arry << arry2[index2..-1]).flatten!
elsif index2 == arry2.length
(f_arry << arry1[index1..-1]).flatten!
elsif arry1[index1] <= arry2[index2]
f_arry << arry1[index1]
index1 += 1
else
f_arry << arry2 [index2]
index2 += 1
end
end
return f_arry
end
ли первая линия
return arry if arry.length == 1
пинать его из рекурсивного разбиения массива (ов), а затем в обходе рекурсивного расщепления части методы, чтобы вернуться к раздел рекомбинации? Похоже, он должен просто продолжать повторять его, как только он вернется в этот раздел, когда он повторится.Почему это должно быть
flatten
-ed?
Вот что у меня проблемы с этим: – spectre6000
@ spectre6000 - где? –
Предположим, что в массиве из [1,2,3,4] Пройдите, как я понимаю: Проснитесь через рекурсию, пока у вас не будет 4 массива с одним номером. Оператор if захватывает его и возвращает четыре массива чисел; они уже отсортированы, так что это условие остановки. Получил эту часть. Я теряюсь примерно на шаг или около того.Нижняя ступень затем рекомбинирует одиночные массивы в два набора из двух, но затем нужно перекомбинировать эти два ... SORTED множества! Нажмите. Я понимаю, почему и что это должно быть .flatten (ed) !, что я не совсем понимаю, почему это должно быть в этом точном месте ... – spectre6000