在Ruby中排序数组

从一开始,分类就成为计算机科学家关注的问题。有许多算法进入和退出使用,直到今天,新算法仍在推动性能的界限。作为一种**语言,如果您关心性能,您将在Ruby中实现排序算法,此外,排序数组和其他集合仍然是Ruby为您做的更多事情。

科普_1

01

04

14排序数组15 16

从技术上讲,排序是可枚举模块处理的作业。可枚举模块将Ruby中的所有类型的集合联系在一起。它处理迭代集合,排序,查看和查找某些元素等。可枚举排序集合有点神秘,或者至少它应该保持这种状态。实际的排序算法是不相关的,您只需要知道的是集合中的对象使用"空间船操作员进行比较。"

02

33 of 04 34

在太空中分拣

"空间运营商"获取两个对象,比较它们,然后返回-1,0或1。那'有点模糊,但运算符本身并不't有一个非常明确的行为。以数字对象为例。如果您有两个数字对象ab,并评估a<=>b,则表达式将评估什么?在数字的情况下,它很容易判断。如果a大于b,它将是-1,如果它们're等于它将是0,如果b大于a,它将是1。这用于告诉排序算法两个对象中的哪一个应该首先进入数组。只需记住,如果左手操作数排在数组的**位,它应该评估为-1,如果右手应该排在**位,它应该是1,如果它没有'无论如何它应该是0。

它不't总是遵循这样整齐的规则。如果您在两个不同类型的对象上使用此运算符会发生什么?你'可能会有一个例外。当你打电话1<=>'猴子'?这将相当于调用1。<=>('monkey'),这意味着实际方法被调用在left操作数上如果右手操作数不是数字,则Fixnum##<=>返回零。如果运算符返回零,则排序方法将引发异常。因此,在对数组进行排序之前,请确保它们包含可以排序的对象。

其次,空间运营商的实际行为是't定义。它'仅为某些基本类定义,对于自定义类,它'完全取决于您想要的含义。如果您的学生61>班,您可以按姓氏,名字,年级或其组合对学生进行排序。因此,请始终意识到,除了基本类型外,航天操作员和分拣的行为尚未明确定义。

03

77 of 04 78

执行排序

你有一组数字对象,你想对它们进行排序。有两种主要方法可以做到这一点:排序排序!。**个创建数组的副本,对其进行排序并返回。第二种将阵列排列到位。

那'非常不言自明。所以让它占据一个缺口。如果你不想依靠航天操作员怎么办?如果你想要一个完全不同的行为怎么办?这两种排序方法采用可选的块参数。该块需要两个参数,并且应该像航天操作员那样产生值:-1历史小知识问答,0和1。因此,给定一个数组,我们希望对其进行排序,以便所有可被3整除的值都排在前面,而所有其他值都在后面。实际的顺序并不重要,只是那些可被3整除的顺序来了**。

这是如何工作的?首先,注意排序方法的block参数。其次,注意块参数的模块划分,以及航天操作员的重用。如果一个是3的倍数,则模块将是0,否则,它将是1或2。由于0将在1或2之前排序,因此这里只有模块很重要。使用块参数在具有多种元素类型的数组中特别有用,或者当您想要对没有't具有定义的空间运算符的自定义类进行排序时。

04

109 of 04 110

最后一种排序

还有一种排序方法,称为sort_by。但是,在处理排序之前,您应该首先了解使用map翻译数组和集合。