Ruby Bubble Sort的问题

时间:2014-10-07 13:44:35

标签: ruby

我必须在项目中为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)

1 个答案:

答案 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作为参数传递已完全过时。