以递归方式在Ruby中实现Mergesort

时间:2016-06-23 14:55:42

标签: ruby recursion mergesort

我过去几个月一直在自学编程,我终于到了递归。现在,我应该递归地实现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])

1 个答案:

答案 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