Masyvų rūšiavimo metodai Ruby

Rūšiavimas jau nuo pat pradžių buvo kompiuterių mokslininkų rūpestis. Jų buvo daug algoritmai kurie atsirado ir nebenaudojami, ir vis dar šiandien nauji algoritmai stumia našumo ribas. Būdami aukšto lygio kalba, rūšiavimo algoritmų neįdiegsite Rubinas jei jums rūpi našumas, be to, rūšiavimas Masyvai ir kitos kolekcijos yra dar daugiau dalykų, kuriuos „Ruby“ daro už jus.

Techniškai rūšiavimas yra darbas, kurį atlieka Enumerable modulis. Skaičiuojamas modulis yra tai, kas sujungia visų rūšių „Ruby“ kolekcijas. Tai tvarko kolekcijų pakartojimą, rūšiavimą, peržvalgą ir tam tikrų elementų paiešką ir kt. Tai, kaip „Enumerable“ rūšiuoja kolekciją, yra šiek tiek paslaptis ar bent jau tokia turėtų būti. Faktinis rūšiavimo algoritmas neturi reikšmės, reikia žinoti tik tai, kad kolekcijos objektai lyginami naudojant „erdvėlaivio operatorių“.

„Erdvėlaivio operatorius“ paima du objektus, juos lygina ir tada gauna -1, 0 arba 1. Tai šiek tiek neaišku, tačiau pats operatorius neturi labai tiksliai apibrėžto elgesio. Paimkime, pavyzdžiui, skaitmeninius objektus. Jei turite du skaitinius objektus

instagram viewer
a ir b, ir įvertinti a <=> b, ką vertins išraiška? Skaitmenų atveju lengva pasakyti. Jei a yra didesnis nei b, tai bus -1, jei jie yra lygūs, bus 0, o jei b yra didesnis nei a, tai bus 1. Tai naudojama rūšiavimo algoritmui nusakyti, kuris iš dviejų objektų turėtų būti pirmasis masyvas. Tiesiog nepamirškite, kad jei kairiosios rankos operandas turi būti pirmas masyve, jis turėtų būti įvertintas iki -1, jei dešinė ranka turėtų būti pirmoji, ji turėtų būti 1, o jei nesvarbu, ji turėtų būti 0.

Ne visada laikomasi tokių tvarkingų taisyklių. Kas nutiks, jei naudosite šį operatorių dviejuose skirtingų tipų objektuose? Tikriausiai gausite išimtį. Kas nutinka, kai paskambini 1 <=> 'beždžionė'? Tai bus pašaukimo atitikmuo 1. <=> ('beždžionė'), tai reiškia, kad naudojamas tikrasis metodas liko operandą ir Fixnum # <=> grąžina nulį, jei dešinysis operandas nėra skaičius. Jei operatorius grąžins nulį, rūšiavimo metodas sukels išimtį. Taigi prieš rūšiuodami masyvus įsitikinkite, kad juose yra objektų, kuriuos galima rūšiuoti.

Antra, tikras kosminio laivo operatoriaus elgesys nėra apibrėžtas. Tai apibrėžta tik kai kurioms pagrindinėms klasėms, o jūsų pasirinktoms klasėms visiškai priklauso nuo to, ką norite, kad jie reikštų. Jei turite Studentas klasėje galite mokinius rūšiuoti pagal pavardę, vardą, pažymio lygį ar jų derinį. Taigi visada žinokite, kad erdvėlaivio operatoriaus elgesys ir rūšiavimas nėra tiksliai apibrėžti, išskyrus pagrindinius tipus.

Turite daugybę skaitmeninių objektų ir norite juos rūšiuoti. Yra du pagrindiniai metodai, kaip tai padaryti: rūšiuoti ir rūšiuoti!. Pirmasis sukuria masyvo kopiją, ją rūšiuoja ir grąžina. Antrasis rūšiuoja masyvą vietoje.

Tai gana savaime suprantama. Taigi, paimkime tai per žingsnį. Ką daryti, jei nenorite pasikliauti erdvėlaivio operatoriumi? Ką daryti, jei norite visiškai kitokio elgesio? Šie du rūšiavimo būdai yra pasirenkami bloko parametrai. Šis blokas turi du parametrus ir turėtų duoti reikšmes, kaip tai daro erdvėlaivio operatorius: -1, 0 ir 1. Taigi, atsižvelgiant į masyvą, mes norime jį surūšiuoti, kad visos vertybės, kurios dalijamos iš 3, būtų pirmos, o visos kitos ateitų po. Faktinė tvarka čia nesvarbi, tik tai, kad pirmos dalijasi 3.

Kaip tai veikia? Pirmiausia atkreipkite dėmesį į rūšiavimo metodo blokinį argumentą. Antra, atkreipkite dėmesį į modulio padalijimus, padarytus dėl bloko parametrų, ir apie pakartotinį kosminio laivo operatoriaus naudojimą. Jei vienas yra 3 kartotinis, modulis bus 0, kitu atveju jis bus 1 arba 2. Kadangi 0 surūšiuos prieš 1 ar 2, čia svarbu tik modulis. Bloko parametro naudojimas yra ypač naudingas masyvuose, kuriuose yra daugiau nei vieno tipo elementai, arba kai norite rūšiuoti pasirinktinėse klasėse, kuriose nėra apibrėžto erdvėlaivio operatoriaus.

Yra dar vienas rūšiavimo metodas, vadinamas Rūšiuoti pagal. Tačiau prieš pradėdami spręsti rūšiavimą, pirmiausia turėtumėte suprasti masyvų ir kolekcijų vertimą žemėlapiu.