Ruby:堆栈级别太深(SystemStackError)实现合并排序与倒置计数

标签 ruby mergesort

这是我的代码。

@@inversions = 0
numbers = [very big array]

def merge_sort(array)
  return array if array.size <= 1

  left = array.slice(0, (array.size / 2).round)
  right = array - left
  merge(merge_sort(left), merge_sort(right))
end

def merge(left, right)
  return right if left.empty? # crashes here with stack level too deep
  return left if right.empty?

  if left.first <= right.first
    [left.first] + merge(left[1..-1], right)
  else
    @@inversions += left.size
    [right.first] + merge(left, right[1..-1])
  end
end

你能告诉我失败的原因吗? (适用于大小小于 ~ 15000 的数组)

最佳答案

您的递归合并功能可能是原因。对于数组中的每个元素,您将在堆栈中更深一层。标准归并排序不应比 lg(N) 更深。尝试将 merge 重写为迭代而不是递归。

有点像

def merge left,right
  a = []
  while !left.empty? and !right.empty?
    if left.first < right.first
       a<<left.shift
    else 
       a<<right.shift
    end
  end
  a + left + right
end

关于Ruby:堆栈级别太深(SystemStackError)实现合并排序与倒置计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9812206/

相关文章:

c - 在c中对结构数组进行排序

ruby-on-rails - 不兼容的字符编码 : Windows-1252 and UTF-8 yml files

Javascript:合并排序的 JavaScript 实现有什么问题?

ruby - Watir - 在方法之外记录

ruby-on-rails - Ruby:根据指定顺序从散列中连接字段?

c++ - C++中的合并排序实现

java - 你如何证明或说明快速归并排序是一种不稳定的算法?

algorithm - 为什么我们在合并排序算法中将 i 作为 log(n-1) 插入

ruby-on-rails - 获取 XML 文件 POST 请求以使用 Ruby on Rails 解析

ruby - 使用特定规则拆分字符串的最干净的 ruby​​ 代码