2016-11-11 23 views
2
def bubble_sort(a) 
    something_changed = false 
    swap = 0 
    a[0...-1].each_with_index do |num, i| 
    if a[i] > a[i + 1] 
     a[i], a[i + 1] = a[i + 1], a[i] 
     something_changed = true 
     swap += 1 
    end 
    end 
    bubble_sort(a) if something_changed 
    p swap 
end 

arr = [50, 60, 70, 20, 30, 10] 
bubble_sort(arr) 
# 0 
# 1 
# 1 
# 3 
# 3 
# 3 

所以我一直在這一段時間,並嘗試過每一個方式。我已經設法瞭解數組如何通過冒泡排序進行排序,並且我知道對於這個特定的數組,有11個替換髮生在要排序的數組上。每次該方法遞歸運行時,我都可以打印掉所有交換次數,但是對於我來說,我無法將這些數字分組到數組中,因此我可以將它們添加並顯示11,任何洞察力都會很棒。我已經在python中完成了解決方案,它工作正常,我只想知道是否有方法將這些數字組合在一起,因爲方法是遞歸運行的。提前致謝。保持使用遞歸的冒泡排序算法中的交換計數?

回答

1
$count = [] 
def bubble_sort(a) 
something_changed = false 
swap = 0 
a[0...-1].each_with_index do |num, i| 
    if a[i] > a[i + 1] 
    a[i], a[i + 1] = a[i + 1], a[i] 
    something_changed = true 
    swap += 1 
    end 
end 
bubble_sort(a) if something_changed 
$count << swap 
return $count.inject(:+) 
end 
arr = [50, 60, 70, 20, 30, 10] 
p bubble_sort(arr) # 11 

不要緊,原來我用全局變量我設置,而不是回報的P(這是我與前面的實驗,在上述問題未顯示)。現在我只能顯示替換的數量。希望這可以幫助某個人。謝謝你的時間。

2

你也可以沒有全局變量:

def bubble_sort(a, swap_sum = 0) 
    something_changed = false 
    a[0...-1].each_with_index do |num, i| 
    if a[i] > a[i + 1] 
     a[i], a[i + 1] = a[i + 1], a[i] 
     something_changed = true 
     swap_sum += 1 
    end 
    end 
    something_changed ? bubble_sort(a, swap_sum) : swap_sum 
end 

arr = [50, 60, 70, 20, 30, 10] 
bubble_sort(arr) #=> 11 
+0

尼斯修改將其作爲一個參數,無需的確是全球陣列。 – kparekh01