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

我必须在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] > 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
是完全过时的。

它以什么方式不起作用?它正在打印传入的原始数组。您是否进行过任何调试?我不记得冒泡排序应该是如何工作的,但是您所犯的错误将变得非常明显,甚至只需进行最小程度的调试。我会给你一个提示,我会调查名单,每个街区。而您缺少了算法的递归部分。