【问题标题】:Need help understanding syntax/logic in Ruby bubble sort solution需要帮助理解 Ruby 冒泡排序解决方案中的语法/逻辑
【发布时间】:2015-10-24 03:46:36
【问题描述】:

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

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 并且循环继续。但如果有人能再向我解释一下,我将不胜感激。

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

【问题讨论】:

    标签: arrays ruby sorting bubble-sort


    【解决方案1】:

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

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

    【讨论】:

    • 动画很棒!
    • 非常感谢您的解释,非常有帮助!动画也很棒!
    【解决方案2】:

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

    外部until sorted 循环重复此过程,直到不再有任何变化。至此数组排序完毕。

    sorted 变量记录我们在最后一次遍历数组期间是否交换了任何元素。如果我们这样做了,数组就改变了,我们还没有完成。另一方面,如果没有元素被交换,sorted = false 不会被执行,sorted 仍然是true,我们可以退出外循环。

    【讨论】:

    • 谢谢你,你很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2019-01-25
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多