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

À propos de l'utilisation du tri dans Golang

藏色散人
藏色散人avant
2020-10-10 14:59:302584parcourir

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

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)}

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]}

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)}

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}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer