我试图排序一个随机数组的15个元素之前,创建一个二叉搜索树使用快速排序和一个错误弹出。我似乎不能找到问题所在。
这是错误:
C:/Users/K/Desktop/odin/FullStack/Ruby_on_Rails/Ruby/projects/binary-search-trees/lib/tree.rb:197:in `<=': comparison of Integer with nil
failed (ArgumentError)
from C:/Users/K/Desktop/odin/FullStack/Ruby_on_Rails/Ruby/projects/binary-search-trees/lib/tree.rb:197:in `block in partition'
from C:/Users/K/Desktop/odin/FullStack/Ruby_on_Rails/Ruby/projects/binary-search-trees/lib/tree.rb:194:in `each'
from C:/Users/K/Desktop/odin/FullStack/Ruby_on_Rails/Ruby/projects/binary-search-trees/lib/tree.rb:194:in `partition'
from C:/Users/K/Desktop/odin/FullStack/Ruby_on_Rails/Ruby/projects/binary-search-trees/lib/tree.rb:181:in `quick_sort'
from C:/Users/K/Desktop/odin/FullStack/Ruby_on_Rails/Ruby/projects/binary-search-trees/lib/tree.rb:185:in `quick_sort'
from C:/Users/K/Desktop/odin/FullStack/Ruby_on_Rails/Ruby/projects/binary-search-trees/lib/tree.rb:10:in `initialize'
from ./lib/main.rb:5:in `new'
from ./lib/main.rb:5:in `<main>'
快速排序的方法是:
def quick_sort(array, s, e)
if s < e
p = partition(array, s, e)
quick_sort(array, s, p - 1)
quick_sort(array, p + 1, e)
end
array.uniq!
array
end
问题出在下面的helper方法中:
def partition(array, s, e)
x = array[e]
i = s - 1
(s...e).each do |j|
next unless array[j] <= x
i += 1
swap(array, i, j)
end
swap(array, (i + 1), e)
i + 1
end
完整的代码如下所示:
def quick_sort(array, s, e)
if s < e
p = partition(array, s, e)
quick_sort(array, s, p - 1)
quick_sort(array, p + 1, e)
end
array.uniq!
array
end
def partition(array, s, e)
x = array[e]
i = s - 1
(s...e).each do |j|
next unless array[j] <= x
i += 1
swap(array, i, j)
end
swap(array, (i + 1), e)
i + 1
end
def swap(array, i, j)
temp = array[i]
array[i] = array[j]
array[j] = temp
array
end
1条答案
按热度按时间hgqdbh6s1#
我发现问题出在quick_sort方法中的破坏性方法uniq!上,该方法修改了数组,但边界s和e保持不变。我将其更改为返回数组中的uniq元素。答案如下