我必须在项目中为ruby做一个泡泡排序,我遇到了麻烦。我将维基百科上的伪代码翻译成ruby,但它没有按预期工作。我不太确定是什么错误。
swapped = false
def bubble_sort(list,swapped)
length = list.length
i = 1
until !swapped do
swapped = false
list.each do |i|
if list[i-1] > list[i]
list[i-1], list[i] = list[i], list[i-1]
swapped = true
end
end
end
return list
end
puts bubble_sort([1,3,7,4,6,9,10,5,8,2], swapped)
答案 0 :(得分:1)
你的主要问题在于:
until !swapped do
由于swapped
为false,因此循环不会执行一次。
除此之外:
list.each do |i|
if list[i-1] > list[i]
list[i-1], list[i] = list[i], list[i-1]
swapped = true
end
end
i
不是索引,但第三个元素的值list[i-1]
将计算为list[6]
(第三个元素为7)。相反,您需要使用索引:
list.each_index do |i|
if list[i-1] > list[i]
list[i-1], list[i] = list[i], list[i-1]
swapped = true
end
end
另一个问题是list[-1]
是一个有效的语法,它将返回数组的最后一个元素。你需要跳过这个元素。你的swapped
逻辑在这里也是不正确的,你交换第一个元素时将它设置为true,将until
条件改为false并打破循环,你应该反过来设置它。
def bubble_sort(list)
swapped = true
while swapped do
swapped = false
list.each_index do |i|
next if i == 0
if list[i-1] > list[i]
list[i-1], list[i] = list[i], list[i-1]
swapped = true
end
end
end
list
end
很少有笔记,你不需要return语句,ruby方法返回最后执行的行的值。将swapped
作为参数传递已完全过时。