Python implémente le tri par comptage

Python implémente le tri par comptage

1. Introduction au comptage et au tri

Counting Sort est un algorithme de tri qui ne compare pas la taille des données et est un algorithme de tri qui sacrifie l'espace au temps.

Le tri par comptage convient pour trier des données avec une grande quantité de données et une petite plage de données, comme le tri de l'âge des personnes, le tri des résultats de test, etc.

Le tri par comptage trouve d'abord la valeur maximale k dans la liste à trier et ouvre une liste de comptage de longueur k + 1, et toutes les valeurs initiales de la liste de comptage sont 0. En visitant la liste à trier, si la valeur de l'élément visité est i, la valeur de l'index i dans la liste de comptage est augmentée de 1, et en visitant la liste complète à trier, vous pouvez compter le nombre de chaque valeur dans le liste à trier. Créez ensuite une nouvelle liste et ajoutez le nombre correspondant de i à la nouvelle liste en fonction du nombre compté dans la liste de comptage pour obtenir une liste triée.

Deuxièmement, le principe de comptage et de tri

Le principe du comptage et du tri est le suivant:

1. Recherchez la valeur maximale k dans la liste à trier et créez une liste de comptage d'une longueur de k + 1. Les valeurs de la liste de comptage sont toutes égales à 0.

2. Consultez la liste à trier. Si la valeur de l'élément visité est i, la valeur de l'index i dans la liste de comptage est augmentée de 1.

3. Consultez la liste complète à trier, la valeur j de l'index i dans la liste de comptage indique que le nombre de i est j, et comptez le nombre de chaque valeur de la liste à trier.

4. Créez une nouvelle liste, parcourez la liste de comptage et ajoutez séquentiellement j i à la nouvelle liste. La nouvelle liste est la liste triée. L'ensemble du processus ne compare pas la taille des données de la liste à trier.

Prenons l'exemple de la liste [5, 7, 3, 7, 2, 3, 2, 5, 9, 5, 7, 6] par ordre croissant. L'état initial de la liste est indiqué dans la figure ci-dessous.

1. La valeur maximale de la liste à trier est 9, donc ouvrez une liste de comptage d'une longueur de 10, l'index est 0-9 et la valeur est entièrement 0.

2. Consultez la liste à trier. Si la valeur de l'élément visité est i, la valeur de l'index i dans la liste de comptage est augmentée de 1. La valeur du premier élément est 5 et la valeur de l'index 5 dans la liste de comptage est augmentée de 1, de 0 à 1.

3. La valeur du deuxième élément est 7 et la valeur de l'index 7 dans la liste de comptage est augmentée de 1, de 0 à 1.

4. La valeur du troisième élément est 3 et la valeur de l'index 3 dans la liste de comptage est augmentée de 1, de 0 à 1.

5. La valeur du quatrième élément est 7 et la valeur de l'index 7 dans la liste de comptage est augmentée de 1, de 1 à 2.

6. Visitez à plusieurs reprises la liste complète à trier, le nombre de tous les éléments est compté dans la liste de comptage.

7. Créez une nouvelle liste, parcourez la liste de comptage et ajoutez tour à tour le nombre correspondant d'éléments à la nouvelle liste. Les deux 0 et 1 valent 0 et n'ont pas besoin d'être ajoutés. Il y a deux 2. Ajoutez deux 2 à la nouvelle liste. Après avoir ajouté, soustrayez le montant correspondant de la liste de comptage.

8. Il y a deux 3 et continuez à ajouter deux 3 à la nouvelle liste. Après avoir ajouté, soustrayez le montant correspondant de la liste de comptage.

9. Parcourez toute la liste de comptage, après avoir ajouté toutes les données, la nouvelle liste est la liste après le tri. Le résultat du tri est illustré dans la figure ci-dessous.

Troisièmement, Python implémente le comptage et le tri

# coding=utf-8
def counting_sort(array):
    if len(array) < 2:
        return array
    max_num = max(array)
    count = [0] * (max_num + 1)
    for num in array:
        count[num] += 1
    new_array = list()
    for i in range(len(count)):
        for j in range(count[i]):
            new_array.append(i)
    return new_array


if __name__ == '__main__':
    array = [5, 7, 3, 7, 2, 3, 2, 5, 9, 5, 7, 6]
    print(counting_sort(array))

résultat de l'opération:

[2, 2, 3, 3, 5, 5, 5, 6, 7, 7, 7, 9]

Dans le code, utilisez la fonction intégrée Python max () pour trouver la valeur maximale dans la liste à trier. Puis comptez selon le principe de tri analysé ci-dessus, puis ajoutez les données à la nouvelle liste. i représente l'index de la liste de comptage, et représente également l'élément de la valeur i dans la liste à trier, et j représente qu'il y a j éléments de la valeur i.

Quatrièmement, la complexité temporelle et la stabilité du comptage et du tri

1. Complexité temporelle

Lors du tri par comptage, chaque élément de la liste à trier doit être visité et compté. La longueur de la liste est n, puis il est nécessaire de parcourir la liste de comptage et d'ajouter des données à la nouvelle liste. La longueur du comptage list est k + 1, et la complexité en temps est T (n) = n + k + 1, puis multipliez le nombre d'étapes pour compter et ajouter des données (constante, n'affecte pas la notation en gros O), donc la complexité du tri de comptage est O (n + k).

2. Stabilité

Selon le scénario d'application du tri par comptage, il existe de nombreux éléments de valeurs égales dans la liste à trier. Cependant, le tri par comptage ne compare pas la taille des données de la liste à trier, ni n'effectue un échange de position, et l'ordre relatif des données égales reste inchangé. Le tri par comptage est donc un algorithme de tri stable.

 

 

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43790276/article/details/107398262
conseillé
Classement