需要帮助理解Ruby冒泡排序解决方案中的语法/逻辑

时间:2015-08-01 16:02:20

标签: arrays ruby sorting bubble-sort

我需要帮助理解此编程解决方案中的一些语法和逻辑。

def bubble_sort(arr)
  sorted = false
  until sorted
    sorted = true
    (arr.count - 1).times do |i|
      if arr[i] > arr[i + 1]
        arr[i], arr[i + 1] = arr[i + 1], arr[i]
        sorted = false
      end
    end
  end

  arr
end

具体来说,我在使用until循环以及sorted = truesorted = false来理解部件时遇到了一些麻烦。我在这里做了一些阅读,我认为如果需要对数组进行更改,我会得到它,sorted设置为false并继续循环。但如果有人能再一次向我解释这一点,我将不胜感激。

看起来时间循环只对每个数组元素减1执行一次然后交换位置。 until循环如何发挥作用?

2 个答案:

答案 0 :(得分:3)

.times循环对数组进行一次传递,将每个元素与其邻居进行比较,如果它们的顺序错误则交换它们。

外部until sorted循环重复此过程,直到不再发生任何变化。此时,数组已排序。

sorted变量记录我们在上次传递数组时是否交换了任何元素。如果我们这样做了,阵列就会改变,我们还没有完成。另一方面,如果没有交换任何元素,sorted = false未执行,sorted仍为true,我们可以退出外部循环。

答案 1 :(得分:2)

你是正确的,它遍历数组,检查值和交换(如果需要) - 如果在该进程中完全交换它认为数组未排序并设置sorted = false。如果是这种情况,until循环将确保在整个数组中发生整个新传递,以再次重做该进程。直到循环停止的唯一时间是在传递期间没有完成单个交换。在每个until循环的开头,sorted被设置为true,因为它假设这将是最后一次传递 - 除非进行了设置sorted = false的交换,那么它将至少再进行一次传递。

如果您想要一个整洁的动画来查看各种排序算法中发生的情况,请查看http://visualgo.net/sorting.html#