Ruby组合比较运算符排序

时间:2014-04-23 12:54:33

标签: ruby sorting operator-keyword

以下代码按升序对数组进行排序。

my_array = [2, 3, 1, 5, 4]
my_array.sort! { |n1, n2| n1 <=> n2 }

我读到如果第一个对象小于第二个对象,则<=>运算符返回-1;如果第一个对象等于第二个对象,则0返回1第一个对象大于第二个对象。

这些信息如何导致对列表进行排序?我想知道给定代码是如何工作的。

如果我们在<=>运算符周围交换项,则数组按降序排序。但是如何?

3 个答案:

答案 0 :(得分:1)

那里有很多sorting algorithms(ruby使用quicksort),但所有这些都有一个验收测试:对于数组a[n] {{1}中的每个元素a }}

a[n] <= a[n+1]方法中的块应返回的是sort!的含义。如果已知 - 排序可能发生 - 这就是算法需要知道的全部内容,因为它可以比较数组中的任何两个元素并知道它们是否应该被交换。

当您将<=n1交换时,您只需说明,对于此次调用,您希望n2实际上是<=,这会颠倒数组的最终顺序。 ..


Ruby需要精心设计的>=,因为像<=>这样的运算符会返回两个可能结果中的一个 - <true

如果我们使用false,例如,对于<,算法可能会要求[5, 5]返回a[0] < a[1],因此算法会交换它们,但是再次{ {1}}将返回false,算法可能会失败。

在最好的情况下 - 会有过多的操作,性能会受到影响,在最坏的情况下 - 算法可能永远不会完成......

答案 1 :(得分:1)

根据使用数组的每对元素计算的块的值来完成排序。如果您在块中有<=>语句,则值可以是-101,如您所知。在某些类上定义了自然排序顺序。在数字的情况下,它们遵循传统数学意义上的不等式顺序,即-10之前,在1之前。

答案 2 :(得分:0)

查看所有不同的Sorting Algorithms,您将开始了解如何使用两个元素的比较来实现元素列表的排序算法。

这些visualisations可能有助于更好地理解算法之间的差异。