Я пытаюсь написать рубиновый метод, который рекурсивно выполняет сортировку слияния. У меня есть метод работы, но это один из тех случаев, когда я случайно его работал, поэтому я понятия не имею, ПОЧЕМУ он работает, и мне хотелось бы понять, как работает код, который я написал. В psuedocode шаги, которые я выполнял, выглядели следующим образом.Рекурсивный слияние сортировки в Ruby
- Сплит исходный массив длины п, пока не имеет п массивы длины 1
- Merge и сортировки 2 массивы длины т в момент времени, чтобы возвращать массив длины т * 2
- Повторите этот шаг выше пока у меня нет ни одного сортированного массива длины n
В принципе, это похоже на то, что большое дерево разветвляется на n ветвей с каждой ветвью, содержащей массив длиной 1. Затем мне нужно взять эти n ветвей и каким-то образом объединить их обратно в одну ветвь внутри метода.
def merge_sort(arr)
return arr if arr.length == 1
merge(merge_sort(arr.slice(0, arr.length/2)),
merge_sort(arr.slice(arr.length/2, arr[-1])))
end
def merge(arr1, arr2)
sorted = []
begin
less_than = arr1[0] <=> arr2[0]
less_than = (arr1[0] == nil ? 1 : -1) if less_than == nil
case less_than
when -1
sorted << arr1[0]
arr1 = arr1.drop(1)
when 0
sorted << arr1[0]
sorted << arr2[0]
arr1 = arr1.drop(1)
arr2 = arr2.drop(1)
when 1
sorted << arr2[0]
arr2 = arr2.drop(1)
end
end until (arr1.length == 0 && arr2.length == 0)
sorted
end
merge_sort([1,6,3,8,22,3,11,24,54,68,79,80,98,65,46,76,53])
#Returns => [1, 3, 3, 6, 8, 11, 22, 24, 46, 53, 54, 65, 68, 76, 79, 80, 98]
метод у меня есть на самом деле правильно сортирует список, но я не совсем уверен, как метод сочетает в себе каждую ветвь, а затем возвращает отсортированный список объединенных, а не только первые две длины одного массива она сочетает в себе.
Кроме того, если у кого-то есть идеи о том, как я могу сделать метод слияния более красивым, чтобы больше походить на код рубина, который я полюбил, пожалуйста, дайте мне знать.
Спасибо, что ваш ответ был именно тем объяснением, которое я искал. Это действительно многое прояснило для меня рекурсию, еще раз спасибо. –