在Ruby中排序數(shù)組

從一開始,分類就成為計算機科學(xué)家關(guān)注的問題。有許多算法進(jìn)入和退出使用,直到今天,新算法仍在推動性能的界限。作為一種**語言,如果您關(guān)心性能,您將在Ruby中實現(xiàn)排序算法,此外,排序數(shù)組和其他集合仍然是Ruby為您做的更多事情。

科普_1

01

04

14排序數(shù)組15 16

從技術(shù)上講,排序是可枚舉模塊處理的作業(yè)。可枚舉模塊將Ruby中的所有類型的集合聯(lián)系在一起。它處理迭代集合,排序,查看和查找某些元素等??擅杜e排序集合有點神秘,或者至少它應(yīng)該保持這種狀態(tài)。實際的排序算法是不相關(guān)的,您只需要知道的是集合中的對象使用"空間船操作員進(jìn)行比較。"

02

33 of 04 34

在太空中分揀

"空間運營商"獲取兩個對象,比較它們,然后返回-1,0或1。那'有點模糊,但運算符本身并不't有一個非常明確的行為。以數(shù)字對象為例。如果您有兩個數(shù)字對象ab,并評估a<=>b,則表達(dá)式將評估什么?在數(shù)字的情況下,它很容易判斷。如果a大于b,它將是-1,如果它們're等于它將是0,如果b大于a,它將是1。這用于告訴排序算法兩個對象中的哪一個應(yīng)該首先進(jìn)入數(shù)組。只需記住,如果左手操作數(shù)排在數(shù)組的第一位,它應(yīng)該評估為-1,如果右手應(yīng)該排在第一位,它應(yīng)該是1,如果它沒有'無論如何它應(yīng)該是0。

它不't總是遵循這樣整齊的規(guī)則。如果您在兩個不同類型的對象上使用此運算符會發(fā)生什么?你'可能會有一個例外。當(dāng)你打電話1<=>'猴子'?這將相當(dāng)于調(diào)用1。<=>('monkey'),這意味著實際方法被調(diào)用在left操作數(shù)上如果右手操作數(shù)不是數(shù)字,則Fixnum##<=>返回零。如果運算符返回零,則排序方法將引發(fā)異常。因此,在對數(shù)組進(jìn)行排序之前,請確保它們包含可以排序的對象。

其次,空間運營商的實際行為是't定義。它'僅為某些基本類定義,對于自定義類,它'完全取決于您想要的含義。如果您的學(xué)生61>班,您可以按姓氏,名字,年級或其組合對學(xué)生進(jìn)行排序。因此,請始終意識到,除了基本類型外,航天操作員和分揀的行為尚未明確定義。

03

77 of 04 78

執(zhí)行排序

你有一組數(shù)字對象,你想對它們進(jìn)行排序。有兩種主要方法可以做到這一點:排序排序!。第一個創(chuàng)建數(shù)組的副本,對其進(jìn)行排序并返回。第二種將陣列排列到位。

那'非常不言自明。所以讓它占據(jù)一個缺口。如果你不想依靠航天操作員怎么辦?如果你想要一個完全不同的行為怎么辦?這兩種排序方法采用可選的塊參數(shù)。該塊需要兩個參數(shù),并且應(yīng)該像航天操作員那樣產(chǎn)生值:-1歷史小知識問答,0和1。因此,給定一個數(shù)組,我們希望對其進(jìn)行排序,以便所有可被3整除的值都排在前面,而所有其他值都在后面。實際的順序并不重要,只是那些可被3整除的順序來了第一。

這是如何工作的?首先,注意排序方法的block參數(shù)。其次,注意塊參數(shù)的模塊劃分,以及航天操作員的重用。如果一個是3的倍數(shù),則模塊將是0,否則,它將是1或2。由于0將在1或2之前排序,因此這里只有模塊很重要。使用塊參數(shù)在具有多種元素類型的數(shù)組中特別有用,或者當(dāng)您想要對沒有't具有定義的空間運算符的自定義類進(jìn)行排序時。

04

109 of 04 110

最后一種排序

還有一種排序方法,稱為sort_by。但是,在處理排序之前,您應(yīng)該首先了解使用map翻譯數(shù)組和集合。