我想寫一個遞歸執行合併排序的ruby方法。我有方法的工作,但這是我不小心得到它的工作,所以我不知道爲什麼它的工作原理,並希望瞭解我寫的代碼是如何工作的。在psuedocode中,我遵循的步驟如下所示。Ruby中的遞歸合併排序
- 分割長度爲n的原始數組,直到我有長度爲1
- 合併的n個陣列和在時間排序2陣列的長度m可返回長度爲m * 2
- 重複上述步驟的陣列直到我有一個現在排序的長度數組
基本上這對我來說是一個大樹分支到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]
我其實正確的方法對列表進行排序,但我不能完全確定該方法如何結合每個分支,然後返回排序合併列表,而不是它結合只是前兩個長一個數組。
此外,如果任何人有我怎樣才能使合併方法漂亮看起來更像我已成長爲愛,請讓我知道Ruby代碼的想法。
非常感謝你的回答正是我所尋找的解釋。它確實爲我遞歸了很多,再次感謝你。 –