【问题标题】:How does work simple sorting in Ruby? [duplicate]Ruby 中的简单排序如何工作? [复制]
【发布时间】:2017-01-18 20:11:45
【问题描述】:

以下代码按升序返回一个排序好的数组:

books = ["Charlie and the Chocolate Factory", "War and Peace", "Utopia", "A Brief History of Time", "A Wrinkle in Time"]

# To sort our books in ascending order, in-place
books.sort! { |firstBook, secondBook| firstBook <=> secondBook }

这是如何工作的?

首先比较两个对象,然后返回 0、1 或 -1。

但是sort怎么知道排序呢?

【问题讨论】:

  • 为什么您认为比较不会返回01-1"War and Peace" &lt;=&gt; "Utopia" 例如返回 1
  • 您的问题能否更具体一点?您是否在问 Ruby 使用哪种排序算法对对象进行重新排序?您想知道该算法是如何工作的吗?您是在问 Ruby 是如何确定对象 A 应该在对象 B 之前出现的吗?还是您在问如何使用 Array.sort 方法?在引擎盖下,排序不是一项简单的操作。有很多可以解释的。

标签: ruby sorting


【解决方案1】:

sorting algorithms 有任意数量,而 Ruby 使用的那个没有定义,但是如果你查看调用 rb_ary_sort_bangrb_ary_sort 的源代码,你会看到 ruby_qsort。如果您look inside that,您会发现它只是相当标准的qsort_r 的包装。那是quicksort,最常见的排序算法之一。

您的块定义了排序顺序,定义了如何相互比较元素。好的排序算法会尽量限制元素之间的比较次数。

关于快速排序的教程有很多,所以我不会在这里解释它,here's CS50 explaining it。但最有趣的插图可能是as Hungarian Folk Dance,它说明了枢轴的使用和分而治之的方法。帽子显示正在比较的元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-12
    • 2017-04-28
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2018-12-22
    相关资源
    最近更新 更多