Maison > développement back-end > Golang > À propos de l'utilisation du tri dans Golang

À propos de l'utilisation du tri dans Golang

藏色散人
Libérer: 2020-10-10 14:59:30
avant
2694 Les gens l'ont consulté

Ce qui suit est une introduction au tri et à l'utilisation du golang de la colonne tutoriel golang J'espère que cela sera utile aux amis dans le besoin !

À propos de l'utilisation du tri dans Golang

La bibliothèque standard Golang implémente de nombreuses méthodes de tri courantes, telles que la séquence d'entiers tri : sort.Ints(),
Alors que faire si vous triez une structure de données personnalisée ?
Par exemple, triez une liste d'utilisateurs par leurs points :

Définissez d'abord la structure des données Afin d'illustrer clairement le problème, seuls deux champs sont donnés.

type User struct {
	Name  string
	Score int}type Users []User
Copier après la connexion

Si vous souhaitez personnaliser le tri dans Golang, votre propre structure doit implémenter trois méthodes :

// 摘自: $GOROOT/src/sort/sort.gotype Interface interface {
	// Len is the number of elements in the collection.
	Len() int
	// Less reports whether the element with
	// index i should sort before the element with index j.
	Less(i, j int) bool
	// Swap swaps the elements with indexes i and j.
	Swap(i, j int)}
Copier après la connexion

Ce design est merveilleux, n'est-ce pas ? Pensez au tri que nous avons appris, tout ? dont nécessitent des séquences Longueur, taille du rapport, éléments d'échange.
Comment utiliser Golang pour trier les utilisateurs ci-dessus, c'est-à-dire la liste des utilisateurs ?

Implantez d'abord ces trois méthodes comme indiqué :

func (us Users) Len() int {
	return len(us)}func (us Users) Less(i, j int) bool {
	return us[i].Score < us[j].Score}func (us Users) Swap(i, j int) {
	us[i], us[j] = us[j], us[i]}
Copier après la connexion

Ensuite, vous pouvez trier :

func main() {
	var us Users	const N = 6

	for i := 0; i < N; i++ {
		us = append(us, User{
			Name:  "user" + strconv.Itoa(i),
			Score: rand.Intn(N * N),
		})
	}

	fmt.Printf("%v\n", us)
	sort.Sort(us)
	fmt.Printf("%v\n", us)}
Copier après la connexion

Le résultat possible est :

[{ utilisateur0 5} {utilisateur1 15} {utilisateur2 11} {utilisateur3 11} {utilisateur4 13} {utilisateur5 6}]
[{utilisateur0 5} {utilisateur5 6} {utilisateur2 11} {utilisateur3 11} {utilisateur4 13} {utilisateur1 15}]

Comme vous pouvez le constater, les partitions sont classées du plus petit au plus grand.

Mais généralement nos points sont triés du plus grand au plus petit, il suffit de changer
sort.Sort(us) par sort.Sort(sort.Reverse(us)).

C'est vraiment pratique.

Bien sûr, si le tri fourni par le système ne peut pas répondre à nos besoins en raison de besoins particuliers,
nous pouvons toujours mettre en œuvre le tri nous-mêmes. Par exemple, pour ce qui précède, nous pouvons trier nous-mêmes (. du petit au grand) :

func myqsort(us []User, lo, hi int) {
	if lo < hi {
		pivot := partition(us, lo, hi)
		myqsort(us, lo, pivot-1)
		myqsort(us, pivot+1, hi)
	}}func partition(us []User, lo, hi int) int {
	tmp := us[lo]
	for lo < hi {
		for lo < hi && us[hi].Score >= tmp.Score {
			hi--
		}
		us[lo] = us[hi]

		for lo < hi && us[lo].Score <= tmp.Score {
			lo++
		}
		us[hi] = us[lo]
	}
	us[lo] = tmp	return hi}
Copier après la connexion

Un tri simple et rapide, il suffit d'en avoir myqsort(us) lors de l'appel.

Résumé :

  • Les séquences personnalisées doivent implémenter les trois méthodes Less, Swap et Len

Bienvenue pour ajouter et corriger !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal