【发布时间】:2015-07-10 22:41:38
【问题描述】:
我正在尝试编写一个递归执行合并排序的 ruby 方法。我有这个方法工作,但这是我不小心让它工作的时候之一,所以我不知道它为什么工作,并且很想了解我编写的代码是如何工作的。在伪代码中,我遵循的步骤如下所示。
- 拆分长度为 n 的原始数组,直到我有 n 个长度为 1 的数组
- 一次合并并排序 2 个长度为 m 的数组,返回一个长度为 m*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]
我实际上正确地对列表进行排序的方法,但我不完全确定该方法如何组合每个分支,然后返回排序后的合并列表,而不仅仅是它组合的前两个长度为一个的数组。
另外,如果有人对如何使合并方法更漂亮以看起来更像我已经爱上的 ruby 代码有任何想法,请告诉我。
【问题讨论】:
标签: ruby sorting recursion mergesort