2014-10-07 120 views
-2

我必须在项目中使用红宝石进行冒泡排序,并且遇到问题。我将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) 
+1

它以什么方式不起作用? – 2014-10-07 13:47:05

+0

它正在打印传入的原始数组。 – jdublu10 2014-10-07 13:48:38

+2

您是否已完成任何调试?我不记得泡泡排序是如何工作的,但是你所做的错误会在调试时做出极小的努力就会变得非常明显。我会给你一个提示,我会调查list.each块。这和你错过了算法的递归部分。 – 2014-10-07 13:55:40

回答

1

你的主要问题是在这里:

until !swapped do 

因为swapped是假的,不执行甚至一度循环。

除此之外:

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逻辑在这里也是不正确的,只要您交换第一个元素,即将until条件更改为false并断开循环,您就将其设置为true,您应该反过来设置它。

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已完全过时。