Massiivide sortimise meetodid rubiinis

Sorteerimine oli juba varakult arvutiteadlaste mure. Neid oli palju algoritmid mis tulid kasutusele ja langesid kasutusest välja ning tõukavad tänapäeval uued algoritmid jõudluse piire. Kuna olete kõrgetasemeline keel, ei hakka te selles sorteerimisalgoritme rakendama Rubiin kui hoolid tulemuslikkusest, ja peale selle ka sorteerimisest Massiivid ja muud kollektsioonid on veel asjad, mida Ruby teie heaks teeb.

Sorteerimine on tehniliselt moodul Enumerable. Enumerable moodul seob kõik Ruby kollektsiooni tüübid omavahel. See tegeleb kogude iteratsiooni, teatud elementide sorteerimise, otsimise ja otsimisega jne. See, kuidas Enumerable kollektsiooni sorteerib, on natuke mõistatus või vähemalt peaks see nii jääma. Tegelik sortimisalgoritm ei oma tähtsust, ainus, mida peate teadma, on see, et kollektsiooni objekte võrreldakse "kosmoselaeva operaatori" abil.

Kosmoselaeva operaator võtab kaks objekti, võrdleb neid ja siis annab tulemuseks -1, 0 või 1. See on natuke ebamäärane, kuid operaatoril endal pole eriti täpselt määratletud käitumist. Võtame näiteks numbrilised objektid. Kui teil on kaks numbrilist objekti

instagram viewer
a ja b, ja hinnata a <=> b, mida avaldis hindab? Numbrite puhul on seda lihtne öelda. Kui a on suurem kui b, on see -1, kui nad on võrdsed, siis on see 0 ja kui b on suurem kui a, siis on see 1. Seda kasutatakse sortimisalgoritmi määramiseks, milline neist kahest objektist peaks esimesena minema massiiv. Pidage ainult meeles, et kui vasakpoolne operand tuleb massiivis esimesena, peaks see olema väärtus -1, kui parem käsi peaks olema esimene, peaks see olema 1 ja kui see pole oluline, peaks see olema 0.

See ei järgi alati selliseid korrastatud reegleid. Mis juhtub, kui kasutate seda operaatorit kahel erinevat tüüpi objektil? Tõenäoliselt saate erandi. Mis juhtub, kui helistate? 1 <=> 'ahv'? See võrdub helistamisega 1. <=> ('ahv'), mis tähendab, et tegelikku meetodit kutsutakse vasakule operand ja Fixnum # <=> tagastab nulli, kui parempoolne operand ei ole arv. Kui operaator tagastab nulli, suurendab sortimismeetod erandi. Seega enne massiivide sortimist veenduge, et need sisaldavad objekte, mida saab sortida.

Teiseks pole kosmoselaeva operaatori tegelik käitumine määratletud. See on määratletud ainult mõne põhiklassi jaoks ja teie kohandatud klasside jaoks on täiesti teie otsustada, mida soovite nende all mõelda. Kui teil on Üliõpilane klassis saate õpilasi sortida perekonnanime, eesnime, hinde taseme või nende kombinatsiooni järgi. Seega pidage alati meeles, et kosmoselaeva operaatori käitumine ja sortimine pole millegi muu kui põhitüüpide jaoks täpselt määratletud.

Teil on arv numbrilisi objekte ja soovite neid sortida. Selleks on kaks peamist meetodit: sorteerima ja sorteerima!. Esimene loob massiivi koopia, sorteerib selle ja tagastab selle. Teine sorteerib massiivi oma kohale.

See on üsna iseenesest mõistetav. Nii et võtame selle pügala üles. Mis saab, kui te ei soovi kosmoselaeva operaatorile lootma jääda? Mis siis, kui soovite täiesti teistsugust käitumist? Need kaks sortimismeetodit võtavad valikulise ploki parameetri. See plokk võtab kaks parameetrit ja peaks andma väärtused täpselt nagu kosmoselaeva operaator: -1, 0 ja 1. Seega, võttes arvesse massiivi, tahame selle sorteerida nii, et kõik väärtused, mis jagunevad 3-ga, on kõigepealt ja kõik teised tulevad pärast. Tegelik järjekord pole siin oluline, ainult see, et esimesena jagatakse kolmega jagatavad.

Kuidas see töötab? Esiteks pange tähele sortimismeetodi plokiargumenti. Teiseks pange tähele ploki parameetrite modulo-jaotusi ja kosmoselaeva operaatori taaskasutamist. Kui üks on 3-ga kordne, on modulo 0, vastasel juhul on see 1 või 2. Kuna 0 sorteerub enne 1 või 2, on siin oluline ainult modulo. Ploki parameetri kasutamine on eriti kasulik massiivides, milles on rohkem kui ühte tüüpi elemente, või kui soovite sortida kohandatud klassides, millel pole määratletud kosmoselaevade operaatorit.

On veel üks sortimismeetod, nn sorteerima. Enne sort_by käsitlemist peaksite siiski mõistma massiivide ja kogude tõlkimist kaardiga.

instagram story viewer