Metody sortowania tablic w Rubim

Sortowanie od samego początku zajmowało się informatykami. Było wiele algorytmy które pojawiły się i przestały być używane, a do dziś nowe algorytmy przekraczają granice wydajności. Będąc językiem wysokiego poziomu, nie będziesz implementować algorytmów sortowania Rubin jeśli zależy Ci na wydajności, a poza tym na sortowaniu Tablice a inne kolekcje to jeszcze więcej rzeczy, które Ruby dla Ciebie robi.

Technicznie, sortowanie jest zadaniem obsługiwanym przez moduł Enumerable. Moduł Enumerable jest tym, co łączy wszystkie typy kolekcji w Rubim. Obsługuje iterację po kolekcjach, sortowanie, przeglądanie i znajdowanie określonych elementów itp. To, w jaki sposób Enumerable sortuje kolekcję, jest nieco tajemnicą, a przynajmniej tak powinno pozostać. Właściwy algorytm sortowania jest nieistotny, jedyne, co musisz wiedzieć, to porównywanie obiektów w kolekcji za pomocą „operatora statku kosmicznego”.

„Operator statku kosmicznego” bierze dwa obiekty, porównuje je, a następnie zwraca -1, 0 lub 1. To trochę niejasne, ale sam operator nie ma dobrze zdefiniowanego zachowania. Weźmy na przykład obiekty numeryczne. Jeśli masz dwa obiekty numeryczne

instagram viewer
za i bi oceń a <=> b, co oceni wyrażenie? W przypadku Numeriki łatwo to stwierdzić. Jeśli a jest większe niż b, będzie wynosić -1, jeśli będą równe, będzie 0, a jeśli b jest większe niż a, będzie to 1. Służy to do wskazania algorytmowi sortowania, który z dwóch obiektów powinien przejść pierwszy szyk. Pamiętaj tylko, że jeśli lewostronny operand ma zająć pierwsze miejsce w tablicy, powinien ocenić na -1, jeśli prawa ręka powinna być pierwsza, powinna wynosić 1, a jeśli to nie ma znaczenia, powinna wynosić 0.

Nie zawsze przestrzega tak uporządkowanych zasad. Co się stanie, jeśli użyjesz tego operatora na dwóch różnych obiektach? Prawdopodobnie dostaniesz wyjątek. Co się stanie, kiedy zadzwonisz? 1 <=> „małpa”? Będzie to odpowiednik połączenia 1. <=> („małpa”), co oznacza, że ​​wywoływana jest właściwa metoda lewo operand i Fixnum # <=> zwraca zero, jeśli operand po prawej stronie nie jest liczbą. Jeśli operator zwróci zero, metoda sortowania zgłosi wyjątek. Przed sortowaniem tablic upewnij się, że zawierają obiekty, które można sortować.

Po drugie, rzeczywiste zachowanie operatora statku kosmicznego nie jest określone. Jest zdefiniowany tylko dla niektórych klas bazowych, a dla klas niestandardowych zależy wyłącznie od Ciebie, co chcesz, aby one miały na myśli. Jeśli masz Student w klasie możesz sortować ucznia według nazwiska, imienia, poziomu oceny lub ich kombinacji. Zawsze należy więc pamiętać, że zachowanie operatora statku kosmicznego i sortowanie nie jest dobrze zdefiniowane dla niczego poza typami podstawowymi.

Masz tablicę obiektów numerycznych i chcesz je posortować. Istnieją dwie podstawowe metody, aby to zrobić: sortować i sortować!. Pierwszy tworzy kopię tablicy, sortuje ją i zwraca. Drugi sortuje tablicę na miejscu.

To dość oczywiste. Podejmijmy to jeszcze raz. Co jeśli nie chcesz polegać na operatorze statku kosmicznego? Co jeśli chcesz zupełnie inne zachowanie? Te dwie metody sortowania przyjmują opcjonalny parametr bloku. Blok ten przyjmuje dwa parametry i powinien dawać wartości, podobnie jak operator statku kosmicznego: -1, 0 i 1. Tak więc, biorąc pod uwagę tablicę, chcemy ją posortować, aby wszystkie wartości, które można podzielić przez 3, były pierwsze, a wszystkie inne - później. Rzeczywista kolejność nie ma tutaj znaczenia, tylko to, że te, które można podzielić przez 3, są najważniejsze.

Jak to działa? Najpierw zanotuj argument bloku w metodzie sortowania. Po drugie, zwróć uwagę na podział modulo na parametry bloku i ponowne użycie operatora statku kosmicznego. Jeśli jeden jest wielokrotnością liczby 3, moduł będzie wynosił 0, w przeciwnym razie będzie wynosił 1 lub 2. Ponieważ 0 posortuje przed 1 lub 2, tylko modulo ma tutaj znaczenie. Użycie parametru bloku jest szczególnie przydatne w tablicach, które mają więcej niż jeden typ elementu, lub gdy chcesz sortować według niestandardowych klas, które nie mają zdefiniowanego operatora statku kosmicznego.

Istnieje jeszcze jedna metoda sortowania, zwana Sortuj według. Zanim jednak poradzisz sobie z sort_by, powinieneś najpierw zrozumieć tłumaczenie tablic i kolekcji za pomocą map.