以下代码按升序对数组进行排序。
my_array = [2, 3, 1, 5, 4]
my_array.sort! { |n1, n2| n1 <=> n2 }
我读到如果第一个对象小于第二个对象,则<=>
运算符返回-1
;如果第一个对象等于第二个对象,则0
返回1
第一个对象大于第二个对象。
这些信息如何导致对列表进行排序?我想知道给定代码是如何工作的。
如果我们在<=>
运算符周围交换项,则数组按降序排序。但是如何?
答案 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)
根据使用数组的每对元素计算的块的值来完成排序。如果您在块中有<=>
语句,则值可以是-1
,0
或1
,如您所知。在某些类上定义了自然排序顺序。在数字的情况下,它们遵循传统数学意义上的不等式顺序,即-1
在0
之前,在1
之前。
答案 2 :(得分:0)
查看所有不同的Sorting Algorithms,您将开始了解如何使用两个元素的比较来实现元素列表的排序算法。
这些visualisations可能有助于更好地理解算法之间的差异。