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

Arrays 需要帮助理解Ruby气泡排序解决方案中的语法/逻辑吗,arrays,ruby,sorting,bubble-sort,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

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

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=true
sorted=false
的部分时遇到了一些困难。我在这里读了一些书,我想我知道如果仍然需要对数组进行更改,
sorted
设置为
false
,循环继续。但如果有人能再给我解释一次,我将不胜感激


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

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

外部
until sorted
循环重复此过程,直到不再有任何更改。此时将对数组进行排序


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

正确的是,它在数组中迭代,检查值并根据需要进行交换-如果在该过程中进行了交换,则会认为数组未排序,并将sorted=false。如果是这种情况,until循环将确保在整个数组中发生一个新的过程,以再次执行该过程。直到循环停止的唯一时间是在传递过程中没有进行任何交换时。在每个循环开始时,直到sorted设置为true,因为它假定这将是最后一次传递-除非进行交换,将sorted设置为false,否则它将至少再进行一次传递


如果您想要一个简洁的动画来可视化各种排序算法中发生的事情,请查看。

动画很棒!非常感谢您的解释,非常有帮助!动画也很棒!谢谢你,你帮了我很大的忙!