在Ruby中排序數(shù)組
從一開始,分類就成為計(jì)算機(jī)科學(xué)家關(guān)注的問(wèn)題。有許多算法進(jìn)入和退出使用,直到今天,新算法仍在推動(dòng)性能的界限。作為一種**語(yǔ)言,如果您關(guān)心性能,您將在Ruby中實(shí)現(xiàn)排序算法,此外,排序數(shù)組和其他集合仍然是Ruby為您做的更多事情。
01
04
14排序數(shù)組15 16
從技術(shù)上講,排序是可枚舉模塊處理的作業(yè)??擅杜e模塊將Ruby中的所有類型的集合聯(lián)系在一起。它處理迭代集合,排序,查看和查找某些元素等。可枚舉排序集合有點(diǎn)神秘,或者至少它應(yīng)該保持這種狀態(tài)。實(shí)際的排序算法是不相關(guān)的,您只需要知道的是集合中的對(duì)象使用"空間船操作員進(jìn)行比較。"
02
33 of 04 34在太空中分揀
"空間運(yùn)營(yíng)商"獲取兩個(gè)對(duì)象,比較它們,然后返回-1,0或1。那'有點(diǎn)模糊,但運(yùn)算符本身并不't有一個(gè)非常明確的行為。以數(shù)字對(duì)象為例。如果您有兩個(gè)數(shù)字對(duì)象a和b,并評(píng)估a<=>b,則表達(dá)式將評(píng)估什么?在數(shù)字的情況下,它很容易判斷。如果a大于b,它將是-1,如果它們're等于它將是0,如果b大于a,它將是1。這用于告訴排序算法兩個(gè)對(duì)象中的哪一個(gè)應(yīng)該首先進(jìn)入數(shù)組。只需記住,如果左手操作數(shù)排在數(shù)組的第一位,它應(yīng)該評(píng)估為-1,如果右手應(yīng)該排在第一位,它應(yīng)該是1,如果它沒(méi)有'無(wú)論如何它應(yīng)該是0。
它不't總是遵循這樣整齊的規(guī)則。如果您在兩個(gè)不同類型的對(duì)象上使用此運(yùn)算符會(huì)發(fā)生什么?你'可能會(huì)有一個(gè)例外。當(dāng)你打電話1<=>'猴子'?這將相當(dāng)于調(diào)用1。<=>('monkey'),這意味著實(shí)際方法被調(diào)用在left操作數(shù)上如果右手操作數(shù)不是數(shù)字,則Fixnum##<=>返回零。如果運(yùn)算符返回零,則排序方法將引發(fā)異常。因此,在對(duì)數(shù)組進(jìn)行排序之前,請(qǐng)確保它們包含可以排序的對(duì)象。
其次,空間運(yùn)營(yíng)商的實(shí)際行為是't定義。它'僅為某些基本類定義,對(duì)于自定義類,它'完全取決于您想要的含義。如果您的學(xué)生61>班,您可以按姓氏,名字,年級(jí)或其組合對(duì)學(xué)生進(jìn)行排序。因此,請(qǐng)始終意識(shí)到,除了基本類型外,航天操作員和分揀的行為尚未明確定義。
03
77 of 04 78執(zhí)行排序
你有一組數(shù)字對(duì)象,你想對(duì)它們進(jìn)行排序。有兩種主要方法可以做到這一點(diǎn):排序和排序!。第一個(gè)創(chuàng)建數(shù)組的副本,對(duì)其進(jìn)行排序并返回。第二種將陣列排列到位。
那'非常不言自明。所以讓它占據(jù)一個(gè)缺口。如果你不想依靠航天操作員怎么辦?如果你想要一個(gè)完全不同的行為怎么辦?這兩種排序方法采用可選的塊參數(shù)。該塊需要兩個(gè)參數(shù),并且應(yīng)該像航天操作員那樣產(chǎn)生值:-1歷史小知識(shí)問(wèn)答,0和1。因此,給定一個(gè)數(shù)組,我們希望對(duì)其進(jìn)行排序,以便所有可被3整除的值都排在前面,而所有其他值都在后面。實(shí)際的順序并不重要,只是那些可被3整除的順序來(lái)了第一。
這是如何工作的?首先,注意排序方法的block參數(shù)。其次,注意塊參數(shù)的模塊劃分,以及航天操作員的重用。如果一個(gè)是3的倍數(shù),則模塊將是0,否則,它將是1或2。由于0將在1或2之前排序,因此這里只有模塊很重要。使用塊參數(shù)在具有多種元素類型的數(shù)組中特別有用,或者當(dāng)您想要對(duì)沒(méi)有't具有定義的空間運(yùn)算符的自定義類進(jìn)行排序時(shí)。
04
109 of 04 110最后一種排序
還有一種排序方法,稱為sort_by。但是,在處理排序之前,您應(yīng)該首先了解使用map翻譯數(shù)組和集合。