Maison  >  Article  >  développement back-end  >  Tri par comptage

Tri par comptage

WBOY
WBOYoriginal
2024-07-21 07:24:491190parcourir

Counting Sort

Voici un algorithme de tri à utiliser pour un tableau d'entiers ou de structures dont le code est un entier. Particulièrement utile lorsque la plage d'entiers est de l'ordre de la taille de l'entrée.

L'idée principale est de déterminer la fréquence d'apparition des entiers et de l'utiliser pour déterminer l'ordre de tri.

Un exemple : disons que nous obtenons le tableau {1,3,1,2}.

Déterminez d'abord la plage des entiers, max et min, 1 et 3 pour cette entrée.

Créez ensuite un tableau, appelez-le le tableau des comptes, c'est-à-dire la taille de la plage entière+1, donc 3 (3-1+1) dans ce cas.
Parcourez le tableau d'entrée, en incrémentant l'entrée appropriée en nombre. Le nombre d'une valeur d'entrée donnée sera placé à counts[value - min]. Pour l'entrée donnée, counts[0] contiendra le décompte pour la valeur 1.

Il en résulte le tableau de comptes : {2,1,1}

Déterminez maintenant les décomptes cumulés, qui sont essentiellement counts[i] = counts[i-1]+counts[i].

Il en résulte le tableau des comptes cumulés : {2,3,4}

Créez un tableau de sortie pour l'entrée triée.

Maintenant, parcourez l'entrée dans l'ordre inverse.

À chaque étape, récupérez le nombre cumulé de la valeur dans le tableau d'entrée. La valeur sera placée à l'index du tableau de sortie correspondant au nombre récupéré - 1. Décrémentez ensuite la valeur du nombre cumulé.

Dans la première étape, la valeur 2 est récupérée et un décompte cumulé de 3. La valeur doit être placée à l'index 2 (3-1) dans la sortie.

Dans l'itération suivante, la valeur 1 et le nombre cumulé 2 ; donc ce '1' est placé à l'index 1 (2-1) de la sortie.

En continuant, la valeur 3 et le décompte cumulé 4 ; en le plaçant à l'index 3 de la sortie.

Enfin, la valeur 1 pour la deuxième fois et un décompte cumulé de 1 (puisque le décompte a été décrémenté la première fois qu'il a été vu) ; donc ce '1' est placé à l'index 0 de la sortie.

, Découvrez comment l'itération inverse préserve l'ordre des éléments égaux, rendant le tri "stable"

Le tableau trié résultant est {1,1,2,3}

func CountingSort(in []int) []int {
    // find the min/max values
    min := slices.Min(in)
    max := slices.Max(in)
    // create the count array
    counts := make([]int, max-min+1)
    for _, v := range in {
        counts[v-min]++
    }
    // determine cumulative counts
    for i := 1; i < len(counts); i++ {
        counts[i] = counts[i-1] + counts[i]
    }
    // create the output array
    out := make([]int, len(in))
    for i := range in {
        v := in[len(in)-1-i]
        out[counts[v-min]-1] = v
        counts[v-min]--
    }
    return out
}

Peut-il être rendu plus efficace ? Laissez vos commentaires et suggestions ci-dessous.

Merci !

Le code de cet article et de tous les articles de cette série peut être trouvé ici

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:
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