我过去几个月一直在自学编程,我终于到了递归。现在,我应该递归地实现Mergesort
。我完成了我的研究并了解了应该发生的事情,但我的代码存在一些问题。在这一点上,我不想只是查找答案,因为我更有兴趣弄清楚我做错了什么,而不仅仅是得到答案。我一直在说没有方法错误
未定义的方法`>' for [6]:Array
目前我的代码是这样的:
def merge_sort(arr)
n = arr.length
p = n/2
q = p - 1
return arr if n == 1
l1 = arr[0..q]
l2 = arr[p..n]
l1 = merge_sort(l1)
l2 = merge_sort(l2)
return merge(l1, l2)
end
def merge(arr_1, arr_2)
arr_3 = []
while !arr_1.empty? && !arr_2.empty?
if arr_1[0] > arr_2[0]
arr_3 << arr_2[0]
arr_2.delete_at(0)
else
arr_3 << arr_1[0]
arr_1.delete_at(0)
end
end
if arr_1.length == 0
arr_3 << arr_2[0..-1]
elsif arr_2.length == 0
arr_3 << arr_1[0..-1]
end
arr_3
end
puts merge_sort([2, 6, 4, 5, 7, 9, 8, 3])
答案 0 :(得分:0)
您的arr_3
包含数组数组。您需要在merge
方法
arr_3.flatten
另外,我建议使用有助于理解方法的变量名称。您还应该查看Array
类必须提供的各种方法,因为其中一些方法在编写简洁代码时非常有用。例如,下面是一次重写merge
方法的尝试,保持逻辑与您拥有的相同。在这里,我们通过使用Array#concat
方法
arr_3
成为数组数组
def merge(left, right)
merged_array = []
while !left.empty? && !right.empty?
if left.first > right.first
merged_array << right.shift
else
merged_array << left.shift
end
end
if left.empty?
merged_array.concat right
else
merged_array.concat left
end
merged_array
end