【问题标题】:Ruby quick sort: stack level too deep (SystemStackError)Ruby 快速排序:堆栈级别太深 (SystemStackError)
【发布时间】:2014-08-23 19:15:51
【问题描述】:
def quick_sort(list)
  return list if list.size <= 1
  p = list.sample
  left, right = list.partition{|elmt| elmt <= p}
  quick_sort(left) + quick_sort(right)
end

a = [9,8,7,6,5,0,6]
b = quick_sort(a)
puts b

当我在终端运行它时,它显示:

quick_sort.rb:4: stack level too deep (SystemStackError)

但是我在第 4 行看不到任何问题。任何帮助将不胜感激!

【问题讨论】:

  • 您的quick_sort 函数永远不会达到最终状态。它一直在调用自己,直到系统堆栈耗尽。
  • @lightswitch05 或者递归次数过多,达到堆栈深度限制。
  • @DouglasFShearer 这正是他刚才所说的。
  • 忽略我,查看我对我自己(已删除)答案的评论。

标签: ruby quicksort


【解决方案1】:

您的应用程序没有考虑重复值。在您的示例中,您有两次6。一旦你把数组分解成足够小的块,你就会得到一个像[6,6]这样的卡盘。当您尝试在[6, 6] 上呼叫partition 时,您会得到[[6, 6], []],它会一直尝试呼叫quick_sort。因为它不能被分解,然后[6,6],它只会继续运行,直到你填满你的系统堆栈。

一个简单的解决方案是在检查列表大小之前删除所有重复项。如果删除重复项后大小为&lt; 2,则您已达到最终状态。

最终解决方案:

def quick_sort(list)
  return list if list.uniq.size < 2
  p = list.sample
  left, right = list.partition{|elmt| elmt <= p}
  quick_sort(left) + quick_sort(right)
end

a = [9,8,7,6,5,0,6]
b = quick_sort(a)

当然,你也可以只使用 Ruby 的排序功能:

[9,8,7,6,5,0,6].sort

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 2014-10-25
    • 2017-08-19
    相关资源
    最近更新 更多