Jak posortować wektor w Rust?

86

Jaka jest obecnie zalecana metoda sortowania wartości w wektorze?

Maxim Sloyko
źródło

Odpowiedzi:

92

Zmienny wycinek elementów z całkowitym uporządkowaniem ma sortmetodę.

Ponieważ Vec<T>implementuje DerefMut<[T]>, możesz wywołać tę metodę bezpośrednio na wektorze, więc vector.sort()działa.

Chris Morgan
źródło
Jakie są wymagania dla typu T? Otrzymuję komunikat o błędzie „Vec <MyType> nie implementuje żadnej metody w zakresie o nazwie„ sort ””. Podejrzewam, że może to być spowodowane tym, że nie zaimplementowałem niektórych cech dla MyType, do tej pory mam cmp :: PartialEq i cmp :: PartialOrd.
Maxim Sloyko
9
Istnieje również sort_bymetoda, która pozwala na całkowicie niestandardowy predykat.
huon
9
Jak mówią doktorzy, self.sort()== self.sort_by(|a, b| a.cmp(b)).
Chris Morgan,
1
Możesz po prostu zadzwonić, .sort()jeśli typ Timplementuje cmp::Ordcechę.
Simon Zyx
1
Możesz też rzucić okiem na sort_unstableto, że jest nieco szybszy, ale możesz zmienić kolejność elementów „równych”
Bogdan Mart
1

Chociaż zaproponowane powyżej rozwiązania mogą sortować wektory liczb całkowitych, miałem problemy z sortowaniem wektorów typu float.

Najprostszym rozwiązaniem było użycie szybkiej skrzyni , która może również sortować pływaki. Skrzynia quickersort może również sortować inne wektory dowolnego typu, a także implementuje metody sortowania za pomocą porównań (sort_by).

Poniżej znajduje się kod Rusta:

extern crate quickersort;
//let's create the vector with the values
let mut vals = Vec::new();
vals.push(31.2);
vals.push(31.2);
vals.push(10.0);
vals.push(100.4);
vals.push(4.1);
quickersort::sort_floats(&mut vals[..]); // sort the vector
Salvatore Cosentino
źródło
11
Nie powinieneś potrzebować oddzielnej skrzynki tylko do sortowania spławików - na przykład v.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal))powinieneś pracować z pływakami. (W zależności od tego, co chcesz zrobić z NaN w tablicy, możesz napisać bardziej ostrożną funkcję porównawczą.)
user4815162342
4
Miałem problemy z sortowaniem wektorów floatów - dlatego są już całe pytania i odpowiedzi poświęcone temu konkretnemu problemowi ( stackoverflow.com/q/26489701/155423 , stackoverflow.com/q/28247990/155423 , stackoverflow.com/q/ 37127209/155423 ).
Shepmaster