Ruby快速排序:堆栈级别太深(SystemStackError)

时间:2014-07-02 20:36:33

标签: ruby quicksort

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行看不到任何问题。任何帮助都将不胜感激!

1 个答案:

答案 0 :(得分:3)

您的申请并未考虑重复值。在您的示例中,您有6两次。一旦你将阵列分解成足够小的块,就会得到像[6,6]这样的chuck。当您尝试在partition上拨打[6, 6]时,会收到[[6, 6], []],并且会一直尝试拨打quick_sort。由于它不能被分解,然后再进一步[6,6],它会一直运行直到你填满系统堆栈。

一个简单的解决方案是在检查列表大小之前删除所有重复项。如果您删除了重复项后的尺寸为< 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