【问题标题】:Sort starting with different order从不同的顺序开始排序
【发布时间】:2017-05-10 10:38:13
【问题描述】:

下面的结果是一样的:

[3, 5].sort{|a, b| b <=> a}
[5, 3].sort{|a, b| b <=> a}

我想知道内部发生了什么以及它如何依赖于输入数组。

【问题讨论】:

  • 您发布的两行代码对同一数组的元素的两种不同排列进行排序。它们必须产生相同的结果(根据您的排序规则对值进行排序)。
  • @axiac 您能否解释一下排序块将如何评估。我认为这取决于输入数组
  • 如果他们给出不同的结果,排序的目的是什么?
  • @pramod 当然它取决于输入数组,但Array#sort() 的目的是返回一个数组,该数组包含与指定顺序的输入数组相同的值。只要您使用相同的排序规则(在这种情况下为b &lt;=&gt; a),#sort() 必须始终返回相同的结果,无论输入数组中值的顺序如何。这是Array#sort() 存在的唯一原因。
  • @axiac:其实Enumerable#sortEnumerable#sort_by是不稳定的,所以事实上保证结果总是一样的。实际上,对于相同的输入,甚至不能保证相同。

标签: arrays ruby sorting


【解决方案1】:

第一行:

[3, 5].sort { |a, b| b <=> a }

使用a = 3b = 5 调用块。它返回5 &lt;=&gt; 3 的结果,即1。大于0 的整数告诉sort a 跟在b 后面。因此结果是[5, 3]


第二行:

[5, 3].sort { |a, b| b <=> a }

使用a = 5b = 3 调用块。它返回3 &lt;=&gt; 5 的结果,即-1。小于0 的整数告诉sort b 跟在a 后面。因此,结果(再次)是[5, 3]

【讨论】:

    【解决方案2】:

    因为你是对一个数组进行排序,改变数组的元素顺序并不会改变排序结果。

    这毕竟是排序的重点 - 尽管初始数组排序,但要获得 sorted 结果。

    要更改结果,您需要更改排序规则,而不是数组。

    【讨论】:

    • 这对我来说很有意义,您能否解释一下该块将如何评估。我认为这取决于输入数组。
    • @pramod please see this threadsort 上带有块解释。它不依赖于“输入数组”:)
    【解决方案3】:

    无论输入顺序如何,输出都是相同的,因为您对数组进行了排序。

    如果你想用相反的顺序排序

    [3,5].sort{|a,b| a <=> b}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多