2014-10-07 77 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已完全過時。