ruby - 快速排序实现 : stack level too deep (SystemStackError)

标签 ruby algorithm

所以我试图在 ruby​​ 中实现快速排序,但我得到了这个错误 `quicksort': stack level too deep (SystemStackError)

def quicksort(array)
  if array.length <= 1
    return array
  end
  less = Array.new
  greater = Array.new
  pivot = array[array.length/2]
  array.each do |x|
    if x < pivot
      less << x
    else 
      greater << x
    end
  end
  return quicksort(less) << pivot << quicksort(greater)
end

编辑 我将 else 更改为 elsif x > pivot 并且它似乎有效。

最佳答案

你的算法对我有用,当我生成一个数组进行测试时甚至达到 1e7。

 quicksort Range.new(1,1e7).to_a.shuffle

当然,这需要大约 4.5 GB 的 RAM 才能完成。至于清理输出......

ruby-1.9.3-p0 :018 >       quicksort [1,3,2] # => [1, 2, [], 3, []] 
ruby-1.9.3-p0 :019 >     quicksort [1,4,2,3] # => [1, 2, [3, [4]]] 

改变这一行:

  return (quicksort(less) << pivot << quicksort(greater)).flatten.compact

它使一切变得更干净。

ruby-1.9.3-p0 :037 >       quicksort [1,3,2] # => [1, 2, 3] 
ruby-1.9.3-p0 :038 >     quicksort [1,4,2,3] # => [1, 2, 3, 4] 

关于ruby - 快速排序实现 : stack level too deep (SystemStackError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8057786/

相关文章:

ruby-on-rails - Rails 模型/连接表无法正常工作

ruby - 在 Ruby 中安全地需要 gem

ruby-on-rails - 在第三个模型中加入两个 Rails ActiveRecord 模型

python - BFS 检索每个顺序中值的元素

ruby - rake 中止! Rails 无法生成

Ruby on Rails 3,创建新对象时出现语法错误

algorithm - 持续更新优先级队列的最佳算法/数据结构

php - 使用存储对数组进行排序

java - 使用倒数计时器以特定时间间隔发出信号

algorithm - 高度优化的算法对仅包含 0s n 1s 的数组进行排序