0
votes

Comment réduire la complexité de mon algorithme d'échange pour trier 5 chiffres?

Je pratique pour trier manuellement 5 chiffres en les comparant les uns avec les autres, je dois la boucler avec N ^ 2 fois, mais je veux le réduire.

a1 = 100
a2 = 90
a3 = 45
a4 = 8
a5 = 0
i = 0
while i < 25:
    if a1 > a2:
        tmp = a1
        a1 = a2
        a2 = tmp
    elif a1 > a3:
        tmp = a1
        a1 = a3
        a3 = tmp
    elif a1 > a4:
        tmp = a1
        a1 = a4
        a4 = tmp
    elif a1 > a5:
        tmp = a1
        a1 = a5
        a5 = tmp
    elif a2 > a3:
        tmp = a2
        a2 = a3
        a3 = tmp
    elif a2 > a4:
        tmp = a2
        a2 = a4
        a4 = tmp
    elif a2 > a5:
        tmp = a2
        a2 = a5
        a5 = tmp
    elif a3 > a4:
        tmp = a3
        a3 = a4
        a4 = tmp
    elif a3 > a5:
        tmp = a3
        a3 = a5
        a5 = tmp
    elif a4 > a5:
        tmp = a4
        a4 = a5
        a5 = tmp
    i = i + 1
print(a1, a2, a3, a4, a5)


2 commentaires

Regardez dans d'autres algorithmes de tri, comme tasorther, Quicksort ...


Je me demandais simplement si ce code peut être plus optimal ou pas?


4 Réponses :


0
votes

Vous utilisez un algorithme qui a une complexité de temps de O (n ^ 2) .

Vous devez utiliser certains algorithmes plus rapides tels que Fusionner le tri ou Trier quick Trit . Mais pour les données précédemment triées Quick Trit donnera une mauvaise performance, c'est pourquoi je suggère d'utiliser Fusionner Trier ici.

En outre, vous pouvez utiliser le Tri algorithme, mais parfois ce n'est pas une bonne solution.

Alors, apprenez le Fusionner le tri Algorithm et utilisez-le pour obtenir o (Nlogn) Complexité du temps!


0 commentaires

0
votes

Comme d'autres l'ont suggéré, cet algorithme n'est pas très bon - mais vous pouvez rendre le code mieux (ce que, comme je le comprends, c'est ce que vous demandez).

au lieu d'utiliser un température variable pour le swap, Vous pouvez faire xxx

supprimer avec les trois lignes.

aussi au lieu de xxx

Vous pouvez utiliser xxx

qui est plus élégant.


1 commentaires

J'utilise rarement Python, alors je n'étais pas au courant de cela. J'ai supprimé ce commentaire et la supprimera ensuite pour éviter les commentaires inutiles.



0
votes

Fusion Sort est idéal pour les cas généraux, car la commande est nlogn pour les meilleurs cas, moyens et pires. Mais je suggère le contraire, car le tri fusionner ne serait pas meilleur que certains O (n ^ 2) pour de simples éléments de 5 éléments.

Si vous recherchez un moyen efficace de trier ces 5 numéros dans les étapes les plus courtes possibles, vous trouverez peut-être cette réponse utile. Ici, les 5 numéros sont triés avec seulement 7 étapes (pire des cas). ATTENDU QUE, Même la procédure Fusionner la procédure prend au moins 8 étapes (oubliez le code complexe pour le tri de la fusion).

Tri de 5 entiers avec un max de 7 compare ( https://cs.stackexchange.com/a/10969)


0 commentaires

0
votes

Je me demandais simplement si ce code peut être plus optimal ... P>

Le code est un tri de bulle. Le code doit seulement boucle 4 fois, pas 25 fois. Le code déplace le plus gros élément de A5 sur la première boucle, puis la plus grande à A4 sur la deuxième boucle, puis A3 sur une troisième boucle et A2 sur la quatrième boucle, laissant le plus petit de A1. Déplier la boucle de tri pour la bulle, il faut 10 opérations de comparaison et d'échange: p> xxx pré>


Ceci peut être réduit à 9 comparer et échanger des opérations en utilisant l'un de 180 possible Networks de tri pour 5 éléments. L'optimisation des processeurs pourrait faire certaines des comparies et des swaps en parallèle si les opérations sont indépendantes (n'impliquent pas les mêmes variables): p> xxx pré>


similaire au lien La réponse de Sayooj Samuel, utilisant une combinaison de swaps et d'insertions, le nombre de componses peut être réduit de 9 à 7, mais il reste un maximum de 18 missions qui seraient des swaps ou se déplacent dans d'autres langages de programmation, les déclarations d'autre entraîneraient inconditionnelles. Saute sur la plupart des processeurs et il y a plus de dépendances de séquence, cela peut donc être plus lent que le tri du réseau. P>

if a1 > a2:      a1,a2       = a2,a1
if a3 > a4:      a3,a4       = a4,a3
if a1 > a3:      a1,a2,a3,a4 = a3,a4,a1,a2
if a3 > a5:
    if a1 > a5:  a1,a3,a4,a5 = a5,a1,a3,a4
    else:        a3,a4,a5    = a5,a3,a4
else:
    if a4 > a5:  a4,a5 = a5,a4
if a2 > a4:
    if a2 > a5:  a2,a3,a4,a5 = a3,a4,a5,a2
    else:        a2,a3,a4,a5 = a3,a4,a2,a5
else:
    if a2 > a3:  a2,a3       = a3,a2


0 commentaires