Wie sortiere ich einen Vektor in Rust?

85

Was ist die derzeit empfohlene Methode zum Sortieren von Werten in einem Vektor?

Maxim Sloyko
quelle

Antworten:

91

Eine veränderbare Schicht von Elementen mit einer Gesamtreihenfolge hat eine sortMethode.

Da Vec<T>implementiert DerefMut<[T]>, können Sie diese Methode direkt auf einem Vektor aufrufen, vector.sort()funktioniert also.

Chris Morgan
quelle
Was sind die Anforderungen für den T-Typ? Ich erhalte die Fehlermeldung "Vec <MyType> implementiert keine Methode im Bereich 'sort'". Ich vermute, dass dies daran liegt, dass ich einige Merkmale für MyType nicht implementiert habe. Bisher habe ich cmp :: PartialEq und cmp :: PartialOrd.
Maxim Sloyko
9
Es gibt auch die sort_byMethode, die ein vollständig benutzerdefiniertes Prädikat ermöglicht.
Huon
9
Wie die Dokumente sagen, self.sort()== self.sort_by(|a, b| a.cmp(b)).
Chris Morgan
1
Sie können einfach aufrufen, .sort()wenn der Typ Tdas cmp::OrdMerkmal implementiert .
Simon Zyx
1
Sie könnten auch einen Blick sort_unstabledarauf werfen, dass es etwas schneller ist, aber "gleiche" Elemente neu anordnen
Bogdan Mart
0

Während die oben vorgeschlagenen Lösungen Vektoren von ganzen Zahlen sortieren können, hatte ich Probleme beim Sortieren von Vektoren von Floats.

Die einfachste Lösung war die Verwendung der Quickersort-Kiste , mit der auch Schwimmer sortiert werden können. Die Quickersort-Kiste kann auch andere Vektoren eines beliebigen Typs sortieren und implementiert Methoden zum Sortieren mithilfe von Vergleichen (sort_by).

Es folgt der Rust-Code:

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
quelle
11
Sie sollten keine separate Kiste benötigen, um Schwimmer zu sortieren - zum Beispiel v.sort_by(|a, b| a.partial_cmp(b).unwrap_or(Ordering::Equal))sollten Sie mit Schwimmern arbeiten. (Je nachdem, was Sie mit NaNs im Array tun möchten, können Sie eine sorgfältigere Vergleichsfunktion schreiben.)
user4815162342
4
Ich hatte Probleme beim Sortieren von Floatvektoren - weshalb es bereits ganze Fragen und Antworten zu diesem speziellen Problem gibt ( stackoverflow.com/q/26489701/155423 , stackoverflow.com/q/28247990/155423 , stackoverflow.com/q/ 37127209/155423 ).
Shepmaster