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