Direkt zum Hauptinhalt springen
eLearner.app
Modul 4 · Lektion 5 von 520/50 im Kurs~10 min
Lektionen des Moduls (5/5)

Sortieren mit dem sort-Package

Das Standardpaket sort sortiert Slices an Ort und Stelle. Für Grundtypen (int, float64, string) es gibt direkte Helfer; für jedes andere Stück Sie verwenden sort.Slice mit einer Funktion less(i, j int) bool, die definiert die Sortierung.

Helfer für Basistypen

Go
import "sort"

nums := []int{5, 2, 8, 1}
sort.Ints(nums)        // [1 2 5 8]

words := []string{"c", "a", "b"}
sort.Strings(words)    // [a b c]

fs := []float64{1.5, 0.5, 2.5}
sort.Float64s(fs)      // [0.5 1.5 2.5]

Die Sortierung erfolgt in-place: Das Original-Slice ist mutiert.

sort.Slice: benutzerdefinierte Sortierung

Sie übergeben das Slice und eine Funktion less, die bei zwei Indizes i und j gibt true zurück, wenn das Element i vor j stehen muss:

Go
type Person struct {
    Name string
    Age  int
}

people := []Person{
    {"Bruno", 30},
    {"Anna", 25},
    {"Carla", 28},
}

sort.Slice(people, func(i, j int) bool {
    return people[i].Age < people[j].Age
})
// Anna(25), Carla(28), Bruno(30)

Um umgekehrt zu sortieren, tauschen Sie einfach den Vergleich aus: return people[i].Age > people[j].Age.

Stabile Bestellung

sort.Slice ist nicht garantiert stabil („gleiche“ Elemente können sich ändern relative Reihenfolge). Für eine stabile Sortierung verwenden Sie sort.SliceStable:

Go
sort.SliceStable(people, func(i, j int) bool {
    return people[i].Age < people[j].Age
})

Sortieren nach mehreren Schlüsseln

Gängiges Muster: Sortieren nach Alter und bei gleichem Alter nach Namen:

Go
sort.Slice(people, func(i, j int) bool {
    if people[i].Age != people[j].Age {
        return people[i].Age < people[j].Age
    }
    return people[i].Name < people[j].Name
})

Binäre Suche

sort.SearchInts / sort.Search Arbeit an bereits sortierten Slices:

Go
nums := []int{1, 3, 5, 7, 9}
i := sort.SearchInts(nums, 5)   // 2

Wenn das Element nicht vorhanden ist, wird der Einfügeindex zurückgegeben. Sie finden es in Details, wenn Sie sie brauchen.

Generika (Go 1.21+): slices.Sort

Aus dem slices-Paket der stdlib (Go 1.21):

Go
import "slices"

nums := []int{3, 1, 2}
slices.Sort(nums)               // [1 2 3]
slices.SortFunc(people, func(a, b Person) int {
    return a.Age - b.Age        // -1/0/1
})

Modernere und typsicherere API. Kompatibel mit sort.Slice, aber mehr ergonomisch.

Probieren Sie es selbst aus

Übung#go.m4.l5.e1
Versuche: 0Wird geladen…

Sortieren Sie Zahlen aufsteigend mit sort.Ints.

Editor wird geladen…
Hinweis anzeigen

`sort.Ints` sortiert ein Int-Slice direkt.

Lösung nach 3 Versuchen verfügbar

Übung#go.m4.l5.e2
Versuche: 0Wird geladen…

Sortieren Sie Personen mit sort.Slice aufsteigend nach Alter.

Editor wird geladen…
Hinweis anzeigen

Die Funktion „less“ gibt „true“ zurück, wenn das Element i VOR j stehen muss.

Lösung nach 3 Versuchen verfügbar

Quiz#go.m4.l5.e3
Bereit

Wie sortiert man mit sort.Slice in absteigender Reihenfolge?

Go
sort.Slice(s, func(i, j int) bool { return ??? })
Antwortoptionen

Zusammenfassung

  • sort.Ints / sort.Strings / sort.Float64s für einfache, direkte Typen.
  • sort.Slice(s, less) für Slices jeglicher Art, mit Funktion less(i, j).
  • sort.SliceStable, um die relative Reihenfolge mit demselben Schlüssel beizubehalten.
  • Sortieren nach mehreren Schlüsseln: Kaskade von if in less.
  • Go 1.21+: slices Paket mit generischer API (slices.Sort, slices.SortFunc).
  • Für Kartenschlüssel: In Slices extrahieren und sortieren.