Metode sortiranja nizova u Rubyju

click fraud protection

Razvrstavanje je od početka bilo zaokupljanje računarskih znanstvenika. Bilo ih je mnogo algoritmi koji su ušli u upotrebu i ispali iz uporabe, a i danas novi algoritmi guraju granice performansi. Budući da je jezik visoke razine, nećete implementirati algoritme sortiranja u Rubin ako vam je stalo do performansi, a osim toga i razvrstavanja nizovi i druge kolekcije su još stvari koje Ruby čini za vas.

Tehnički gledano, sortiranje je posao kojim upravlja modul Enumerable. Modul Enumerable ono je što povezuje sve vrste kolekcija u Ruby-u zajedno. Rukuje iteriranjem nad kolekcijama, sortiranjem, pregledom i pronalaženjem određenih elemenata itd. Koliko je vrsta zbirke sortirala pomalo je misterija, ili bi barem tako trebala ostati. Stvarni algoritam sortiranja nije bitan, jedino što trebate znati je da se objekti u kolekciji uspoređuju pomoću "operatora svemirskog broda."

"Operator svemirskog broda" uzima dva objekta, uspoređuje ih i zatim vraća -1, 0 ili 1. To je malo nejasno, ali sam operater nema baš dobro definirano ponašanje. Uzmimo za primjer Numeričke predmete. Ako imate dva numerička objekta

instagram viewer
i b, i procijeniti a <=> b, na što će izraz ocjenjivati? U slučaju Numerike to je lako reći. Ako je a veći od b, to će biti -1, ako su jednaki, to će biti 0, a ako je b veći od a, to će biti 1. To se koristi za određivanje algoritma za razvrstavanje koji od dva objekta treba prvo krenuti u red. Sjetite se samo da ako će lijevi operand doći prvi u nizu, trebao bi procijeniti na -1, ako desna ruka prvo mora biti 1, a ako nije važno, trebao bi biti 0.

To ne slijedi uvijek takva uredna pravila. Što se događa ako taj operator upotrebljavate na dva objekta različitih vrsta? Vjerojatno ćete dobiti izuzetak. Što se događa kad nazovete 1 <=> 'majmun'? To će biti ekvivalent pozivu "1. => ( 'Majmun'), što znači da se stvarna metoda poziva na lijevo operand i Fixnum # <=> vraća nulu ako desni operand nije numerički. Ako operator vrati nulu, metoda sortiranja podiže iznimku. Prije razvrstavanja nizova provjerite sadrže li objekte koje je moguće sortirati.

Drugo, nije definirano stvarno ponašanje operatora svemirskog broda. Definirana je samo za neke osnovne klase, a za vaše prilagođene razrede na vama je sve što želite da znače. Ako imate Student razred možete imati sortiranje učenika po prezimenu, imenu, stupnju ocjene ili njihovoj kombinaciji. Stoga uvijek budite svjesni da ponašanje operatora svemirskog broda i razvrstavanje nije dobro definirano za ništa osim za osnovne tipove.

Imate Numerički niz i željeli biste ih razvrstati. Postoje dvije glavne metode za to: sortirati i sortirati!. Prvi stvara kopiju matrice, razvrstava je i vraća. Drugi razvrstava niz na mjestu.

To je prilično samorazumljivo. Dakle, uzmimo zarez. Što ako se ne želite pouzdati u operatora svemirskog broda? Što ako želite potpuno drugačije ponašanje? Ove dvije metode sortiranja uzimaju fakultativni blok parametar. Taj blok uzima dva parametra i treba dati vrijednosti isto kao što to radi operator svemirskog broda: -1, 0 i 1. Dakle, s obzirom na niz, želimo ga razvrstati tako da prvo dođu sve vrijednosti koje su djeljive s 3, a nakon toga sve ostale. Stvarni poredak ovdje nije važan, samo što prvi dolaze oni koji se dijele s 3.

Kako ovo radi? Prvo, zabilježite blok argument na način sortiranja. Drugo, imajte na umu modularne podjele učinjene na blokovskim parametrima i ponovnu upotrebu operatora svemirskog broda. Ako je jedan više od 3, modulo će biti 0, inače će biti 1 ili 2. Budući da će 0 sortirati prije 1 ili 2, ovdje je važan samo modul. Upotreba blok parametra osobito je korisna u nizovima koji imaju više vrsta elemenata ili kada želite sortirati na prilagođene klase koje nemaju definiranog operatora svemirskog broda.

Postoji još jedna metoda sortiranja, nazvana sort_by. Međutim, prvo biste trebali razumjeti prijevod nizova i zbirki s mapom prije nego što se bavite sort_by.

instagram story viewer