Sortierung von Vektoren in Rust: Vollständiger Leitfaden für Anfänger mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Wie man einen Vektor in Rust sortiert: Vom Anfänger zum Profi



Stellen Sie sich vor: Sie schreiben in Rust ein Programm, das eine Liste von Benutzern sammelt – Namen, Alter, Bewertung. Die Daten kommen in chaotischer Reihenfolge. Sie müssen sie alphabetisch oder, sagen wir, nach Alter sortieren ausgeben. Eine bekannte Aufgabe? Wenn Sie auf Stack Overflow gestöbert haben, haben Sie sicherlich die Frage „How to sort a vector in Rust?“ gesehen – sie hat tausende von Aufrufen gesammelt. Und das ist kein Zufall.



Sortierung in Rust ist eines der Themen, bei denen „einfach sort() aufrufen“ möglicherweise nicht funktioniert, wenn Sie ein paar Nuancen nicht kennen. In diesem Artikel werden wir alle gängigen Methoden zum Sortieren eines Vektors behandeln: von der grundlegenden Methode sort() bis hin zu benutzerdefinierten Komparatoren und der Wahl zwischen stabiler und instabiler Sortierung. Sie erfahren, wie Sie einen Vektor in Rust richtig, schnell und ohne Panik sortieren.



Die grundlegende Methode: sort() – wenn alles einfach ist



Der einfachste Weg, einen Vektor zu sortieren, ist die Verwendung der Methode sort(). Sie funktioniert für Typen, die das Merkmal Ord implementieren – das sind alle Standard-Primitive (Zahlen, Zeichenketten, Zeichen).



fn main() {    let mut numbers = vec![4, 2, 9, 1, 5, 6];    numbers.sort();    println!("{:?}", numbers); // Ausgabe: [1, 2, 4, 5, 6, 9]}


Beachten Sie: Die Variable numbers wurde als mut (mutable) deklariert. Die Methode sort() ändert den Vektor direkt, daher wird der Code ohne mut nicht kompilieren. Dies ist ein typischer Anfängerfehler – die Veränderlichkeit zu vergessen.



Dasselbe funktioniert für Zeichenketten:



fn main() {    let mut fruits = vec!["banana", "apple", "cherry", "date"];    fruits.sort();    println!("{:?}", fruits); // Ausgabe: ["apple", "banana", "cherry", "date"]}


Die Standardsortierung von Zeichenketten ist lexikografisch (alphabetisch). Wenn Sie eine Sortierung nach Länge oder unter Ignorierung der Groß-/Kleinschreibung benötigen, lesen Sie den Abschnitt über benutzerdefinierte Komparatoren.



sort_unstable(): Wenn Geschwindigkeit wichtiger ist als Reihenfolge



In Rust gibt es zwei Sortiervarianten: sort() (stabil) und sort_unstable() (instabil). Der Unterschied besteht darin, dass die stabile Sortierung die relative Reihenfolge gleicher Elemente beibehält, die instabile nicht. Das klingt akademisch, ist aber in der Praxis wichtig, wenn Sie komplexe Strukturen sortieren und die Einfügereihenfolge für gleiche Schlüssel beibehalten möchten.



Allerdings hat sort_unstable() einen Vorteil: Sie ist schneller und verbraucht weniger Speicher. Bei großen Vektoren (Millionen von Elementen) kann der Unterschied erheblich sein.



fn main() {    let mut scores = vec![85, 92, 85, 70, 92, 60];    scores.sort_unstable();    println!("{:?}", scores); // Ausgabe: [60, 70, 85, 85, 92, 92]    // Die Reihenfolge der beiden 85er und 92er kann von der ursprünglichen abweichen}


Wann sollte man sort_unstable wählen? Wenn Ihnen die Reihenfolge gleicher Elemente egal ist und Sie nach Leistung streben. Wenn Vorhersagbarkeit wichtig ist (z. B. Sortierung einer Tabelle mit mehreren Spalten), verwenden Sie sort().



sort_by(): Benutzerdefinierte Komparatoren



Was tun, wenn Sie einen Vektor nach einer nicht standardmäßigen Regel sortieren müssen? Zum Beispiel Zahlen absteigend, Zeichenketten nach Länge oder benutzerdefinierte Strukturen nach einem der Felder. Dafür gibt es die Methode sort_by(), die einen Closure-Komparator akzeptiert.



Der Komparator muss Ordering zurückgeben – eine der Optionen: Less, Equal oder Greater. Der einfachste Weg, ein solches Ergebnis zu erhalten, ist die Verwendung der Methoden .cmp() oder .partial_cmp().



Beispiel: Sortierung von Zahlen absteigend.



fn main() {    let mut numbers = vec![4, 2, 9, 1, 5];    numbers.sort_by(|a, b| b.cmp(a));    println!("{:?}", numbers); // Ausgabe: [9, 5, 4, 2, 1]}


Beachten Sie: Wir tauschen a und b –

Blogs

Buchempfehlungen