Ruby冒泡排序问题
我必须在ruby中为一个项目进行气泡排序,我遇到了麻烦。我将wikipedia上的伪代码翻译成ruby,但它没有按预期工作。我不太确定出了什么问题Ruby冒泡排序问题,ruby,Ruby,我必须在ruby中为一个项目进行气泡排序,我遇到了麻烦。我将wikipedia上的伪代码翻译成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
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)
你的主要问题是:
until !swapped do
由于交换的为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]
是有效的语法,将返回数组的最后一个元素。您需要跳过此元素。您的swaped
逻辑在这里也不正确,您在交换第一个元素时将其设置为true,这将更改为false,直到
条件变为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方法返回最后执行的行的值。作为参数传递swaped
是完全过时的。它以什么方式不起作用?它正在打印传入的原始数组。您是否进行过任何调试?我不记得冒泡排序应该是如何工作的,但是您所犯的错误将变得非常明显,甚至只需进行最小程度的调试。我会给你一个提示,我会调查名单,每个街区。而您缺少了算法的递归部分。