0Pricing
Go Academy · Leçon

Tri stable

Préserver l’ordre des éléments égaux

Tri stable est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.

Qu'est-ce qu'un tri stable

Un tri stable conserve l'ordre relatif d'origine des éléments égaux. Si deux enregistrements sont considérés comme égaux, celui qui apparaissait en premier reste en première position.

Pourquoi c'est important

La stabilité est importante lorsque vous triez selon un champ tout en souhaitant conserver un ordre précédent en cas d'égalité. Par exemple, triez selon la ville en conservant l'ordre alphabétique des personnes dans chaque ville.

sort.Slice n'est pas stable

La fonction sort.Slice classique ne garantit pas la stabilité. Les éléments égaux peuvent être réordonnés. Pour garantir la stabilité, utilisez sort.SliceStable.

sort.SliceStable

sort.SliceStable possède la même signature que sort.Slice, mais conserve l'ordre des éléments égaux.

package main

import (
	"fmt"
	"sort"
)

func main() {
	nums := []int{3, 1, 2, 1}
	sort.SliceStable(nums, func(i, j int) bool {
		return nums[i] < nums[j]
	})
	fmt.Println(nums)
}

Observer la stabilité avec des structures

Triez les personnes selon leur âge. Avec un tri stable, les personnes du même âge conservent leur ordre dans les données d'entrée.

package main

import (
	"fmt"
	"sort"
)

type Person struct {
	Name string
	Age  int
}

func main() {
	p := []Person{{"Ann", 30}, {"Bob", 25}, {"Cara", 30}}
	sort.SliceStable(p, func(i, j int) bool {
		return p[i].Age < p[j].Age
	})
	fmt.Println(p)
}

Ann avant Cara

Dans l'exemple précédent, Ann et Cara ont toutes deux 30 ans. Comme Ann apparaissait en premier dans les données d'entrée, un tri stable conserve Ann avant Cara dans le résultat.

Tri en plusieurs passes

La stabilité permet d'effectuer le tri en plusieurs passes. Triez d'abord selon la clé la moins importante, puis selon la plus importante. Chaque passe stable conserve l'ordre précédent en cas d'égalité.

package main

import (
	"fmt"
	"sort"
)

type Rec struct {
	City string
	Name string
}

func main() {
	r := []Rec{{"Rome", "Zoe"}, {"Oslo", "Ann"}, {"Rome", "Ann"}}
	sort.SliceStable(r, func(i, j int) bool { return r[i].Name < r[j].Name })
	sort.SliceStable(r, func(i, j int) bool { return r[i].City < r[j].City })
	fmt.Println(r)
}

sort.Stable

Pour les types qui implémentent sort.Interface, utilisez sort.Stable plutôt que sort.Sort pour obtenir un tri stable.

package main

import (
	"fmt"
	"sort"
)

type ByLen []string

func (s ByLen) Len() int           { return len(s) }
func (s ByLen) Less(i, j int) bool { return len(s[i]) < len(s[j]) }
func (s ByLen) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }

func main() {
	w := []string{"bb", "cc", "a"}
	sort.Stable(ByLen(w))
	fmt.Println(w)
}

Coût de la stabilité

Les tris stables peuvent utiliser légèrement plus de mémoire ou de temps que les tris instables. Si vous n'avez pas besoin de conserver l'ordre des éléments égaux, un simple sort.Slice convient parfaitement.

Quand choisir un tri stable

Choisissez un tri stable lorsque :

  • Les éléments ont un ordre d'origine significatif
  • Vous effectuez plusieurs tris selon des clés différentes
  • Les éléments égaux ne doivent pas être réorganisés

Exemple de vérification du tri stable

Deux éléments ayant des clés de tri égales apparaissent dans l'ordre d'entrée, A puis B. Un tri stable garantit que la sortie conservera A avant B.

package main

import (
	"fmt"
	"sort"
)

func main() {
	type T struct{ Key, Tag int }
	ts := []T{{1, 100}, {1, 200}, {0, 300}}
	sort.SliceStable(ts, func(i, j int) bool { return ts[i].Key < ts[j].Key })
	fmt.Println(ts)
}

Vérification rapide

Vous triez des enregistrements par ville à l'aide de sort.SliceStable. Deux enregistrements ont la même ville. Qu'est-ce qui est garanti ?

Récapitulatif

Le tri stable préserve l'ordre des éléments égaux :

  • sort.SliceStable pour les tranches
  • sort.Stable pour les types sort.Interface
  • Permet d'effectuer plusieurs tris selon des clés différentes

Questions Fréquemment Posées

La leçon « Tri stable » est-elle gratuite ?

Oui — le texte complet de « Tri stable » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Tri stable » ?

Préserver l’ordre des éléments égaux Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Go Academy ?

Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Tri stable » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?

Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Trier des slices
  2. Ordres de tri personnalisés
  3. Rechercher dans des données triées
  4. Tri stable
← Retour à Go Academy