slices.Sort în Go

Sortează crescător, pe loc, un slice de orice tip ordonat (numere, texte).

Sintaxă
import "slices"

func Sort[S ~[]E, E cmp.Ordered](x S)

Ce face slices.Sort

slices.Sort(x) sortează slice-ul x în ordine crescătoare, modificându-l. Merge pentru orice tip din cmp.Ordered: toate tipurile de întregi, float32, float64, string și tipurile proprii definite peste ele.

Este înlocuitorul modern pentru sort.Ints, sort.Strings și sort.Float64s. Pentru ordine descrescătoare sortezi și apoi apelezi slices.Reverse, sau folosești slices.SortFunc cu o funcție de comparare inversată.

La numere cu virgulă, valorile NaN sunt puse la început. Textele sunt comparate octet cu octet.

Parametri

Parametru Descriere
x Slice-ul de sortat.

Ce returnează

Nimic; slice-ul este sortat pe loc.

Exemple

Exemplul 1: Numere, texte și ordine descrescătoare

package main

import (
    "fmt"
    "slices"
)

func main() {
    temperaturi := []float64{12.5, -3, 8.25, 0, 21}
    slices.Sort(temperaturi)
    fmt.Println(temperaturi)

    nume := []string{"Mihai", "Ana", "Ioana", "Bogdan"}
    slices.Sort(nume)
    fmt.Println(nume)

    note := []int{7, 10, 5, 9}
    slices.Sort(note)
    slices.Reverse(note)
    fmt.Println(note)
}

Rezultat

[-3 0 8.25 12.5 21]
[Ana Bogdan Ioana Mihai]
[10 9 7 5]

Exemplul 2: Sortarea unei copii, nu a originalului

Sort modifică slice-ul primit. Dacă vrei să păstrezi ordinea inițială, sortează o copie făcută cu slices.Clone.

package main

import (
    "fmt"
    "slices"
)

func main() {
    sosiri := []string{"Radu", "Ana", "Elena"}
    alfabetic := slices.Clone(sosiri)
    slices.Sort(alfabetic)
    fmt.Println("Ordinea sosirii:", sosiri)
    fmt.Println("Alfabetic:      ", alfabetic)
}

Rezultat

Ordinea sosirii: [Radu Ana Elena]
Alfabetic:       [Ana Elena Radu]

Greșeli frecvente

  • Te aștepți ca slices.Sort să returneze slice-ul sortat: nu returnează nimic. Pentru un slice nou sortat dintr-un iterator există slices.Sorted.
  • Sortezi un slice primit ca parametru și strici datele apelantului: slice-urile împart memoria, deci sortează o copie dacă nu ai voie să-l modifici.

Comenzi înrudite

  • slices.SortFunc: Sortează un slice după o funcție de comparare care returnează negativ, zero sau pozitiv; SortStableFunc păstrează ordinea celor egali.
  • slices.IsSorted: Verifică dacă un slice este sortat crescător; IsSortedFunc folosește o funcție de comparare proprie.
  • slices.Sorted: Strânge valorile unui iterator într-un slice nou și îl sortează: Sorted (ordine naturală), SortedFunc și SortedStableFunc (comparație proprie).
  • sort.Ints: Sortează crescător, pe loc, un []int, []string sau []float64; IntsAreSorted verifică dacă un []int este deja sortat.
  • slices.Reverse: Inversează ordinea elementelor unui slice, pe loc.