我想写一个递归执行合并排序的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代码的想法。
非常感谢你的回答正是我所寻找的解释。它确实为我递归了很多,再次感谢你。 –