在使用递归的冒泡排序算法中保持掉期计数?

时间:2016-11-11 23:57:43

标签: arrays ruby algorithm sorting recursion

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中完成了解决方案并且工作正常,我只是想知道是否有一种方法可以将这些数字组合在一起,因为该方法是递归运行的。提前谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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而不是return(我之前正在尝试的东西,上面的问题没有显示)。现在我只能显示替换次数。希望这可以帮助有人下线。谢谢你的时间。