问题描述
||
我正在尝试使用ruby实现快速排序算法。看看我做了什么:
class Array
def quick_sort #line 14
less=[];greater=[]
if self.length<=1
self[0]
else
i=1
while i<self.length
if self[i]<=self[0]
less << self[i]
else
greater << self[i]
end
i=i+1
end
end
less.quick_sort + self[0] + greater.quick_sort #line 29
end
end
[1,3,2,5,4].quick_sort #line 32
这产生了错误:
bubble_sort.rb:29:in `quick_sort\': stack level too deep (SystemStackerror)
from bubble_sort.rb:29:in `quick_sort\'
from bubble_sort.rb:32
为什么会这样呢?
解决方法
我认为您示例中的问题是您需要明确的
return
。
if self.length<=1
self[0]
本来应该
return [] if self == []
和
less.quick_sort + self[0] + greater.quick_sort #line 29
本来应该
less.quick_sort + [self[0]] + greater.quick_sort #line 29
这是一个工作示例
class Array
def quick_sort
return [] if self == []
pivotal = self.shift;
less,greater = [],[]
self.each do |x|
if x <= pivotal
less << x
else
greater << x
end
end
return less.quick_sort + [pivotal] + greater.quick_sort
end
end
[1,3,2,5,4].quick_sort # => [1,4,5]
,less.quick_sort + self[0] + greater.quick_sort
该行在if语句之外,因此无论self.length<=1
为true都会被执行。因此,该方法无限递归,从而导致堆栈溢出。
还应该指出,self[0]
不会返回数组(除非self
是数组的数组),因此在上面使用Array#+
没有意义。作为quick_sort方法的返回值也没有意义。
,在那部分中,您不应处理\“ = \”情况。仅应处理<和>。因此,您的算法永远不会停止,并且会导致无限递归。
if self[i]<=self[0]
less << self[i]
else
greater << self[i]
end