Aller au contenu

Tri par selection en python maximum


hershel

Messages recommandés

Bonsoir j'ai actuellement un petit problème avec un programme python. En effet il nous est demander de savoir ecrire le code d'un tri par selection du maximum mais peu importent mes effort je ne trouve aucunes pistes sur internet et mon programme refuse de me donner un tableau trié a la fin.
Je ne comprend pas exactement ou j'ai bien pu me tromper et quels sont les point problematiques.
 
Voici mon programme :
 
for i in range(0,len(tab)-1,-1):
|  if tab[0]>tab[i]:
|  | tab[i],tab[0]=tab[0],tab[i]
print(tab)
Lien vers le commentaire
Partager sur d’autres sites

  • E-Bahut

Bonsoir,

Ta ligne :

tab[i],tab[0]=tab[0],tab[i]

sauf erreur peut se décomposer en :
 

tab[i]]=tab[0] ; 0 pour les deux

tab[0]=tab[i] ; Comme tu viens de copier tab[0] dans tab[i], tab[0] ne prend pas l'ex valeur de tab[i]

et tu te retrouves avec la valeur tab[0] des deux côtés.

Tu dois passer par une variable intermédiaire pour ne pas perdre la valeur tab[i]

________________________________________________________________________

https://zestedesavoir.com/billets/3707/permuter-deux-variables-sans-en-utiliser-une-troisieme/

 

Lien vers le commentaire
Partager sur d’autres sites

  • E-Bahut

Bonjour,

Je ne pense pas que l'erreur est dans l'instruction tab[i],tab[0]=tab[0],tab[i] qui permute effectivement les deux valeurs sans perte.

Là où ça coince, c'est ici
for i in range(0,len(tab)-1,-1):
Si on veut un range décroissant, la première valeur doit être le maximum, pas le minimum, donc écrire
for i in range(len(tab)-1,0,-1):

Mais...

Le script tel qu'il est écrit permute simple la valeur initiale du tableau avec la première valeur plus petite trouvée en commençant par la fin. En adaptant un algorithme de tri par sélection du minimum trouvé sur la toile, j'ai obtenu le script ci-dessous, qui semble fonctionner. A vérifier cependant. J'ai mis en tête un générateur aléatoire de tableau, ce qui permet de faire des essais répétitifs.

import random
L0=[]
for i in range(0,50):
    n=random.randint(1,1000)
    while n in L0:
        n=random.randint(1,1000)
    L0.append(n)
    
tab=L0[0:15]
print(tab)

for i in range(len(tab)-1,0,-1):
    ind_max=i
    for j in range (i-1,-1,-1):
        if tab[j]>tab[ind_max]:
            ind_max=j
    tab[i],tab[ind_max]=tab[ind_max],tab[i]
print(tab)

 

Lien vers le commentaire
Partager sur d’autres sites

  • E-Bahut

Bonsoir Denis,

J'espère quand même que hershel va revenir car sinon, comme trop souvent, on se sera cassé la tête pour rien, sauf à en apprendre un peu plus sur Python.

A ce propos, j'avais bien compris que for i in range(1,10) s'arrêtait à i=9 (seul Python sait pourquoi) mais je n'avais pas percuté que, dans l'autre sens, for i in range (10,0,-1) s’arrêterait à i=1 . Dans l'optique de Python, c'est logique, on s'arrête à l'avant dernier terme, mais c'est quand même troublant.
En passant, ça explique que, dans mon script, on a for j in range (i-1,-1,-1) alors qu'il n'y a évidemment aucun terme d'indice -1 dans la liste.

Avec les "vieux" basic ou pascal, on n'avait pas ces problèmes, mais on a voulu changer (en mieux, faudrait qu'on me le justifie, dans les précédents, par exemple, les Begin End permettaient de parfaitement délimiter les sous-éléments alors que là, il faut jongler avec les indentations).

Bon week-end.

Lien vers le commentaire
Partager sur d’autres sites

  • E-Bahut

Bonsoir Jules,

Oui c'est un peu désarçonnant au début les indentations. Et ce qui va de paire, les "deux points" au bout de la ligne. Je ne sais pas ce que tu utilises comme IDE. Moi cest Thonny. La coloration syntaxique aide un peu et surtout la coloration "fautedesyntaxique" en cas d'oubli des "deux points", des guillemets, des crochets ou de parenthèses.

Je ne suis pas très doué en Python. Heureusement qu'il y a le Net car j'en fais par périodes puis lorsque j'arrête, à la période suivante j'ai oublié pas mal de choses.

Je suis obligé de taper le nom de l'instruction que je cherche à utiliser, ou bien décrire ce que je veux faire pour obtenir le nom de l'instruction.

Lien vers le commentaire
Partager sur d’autres sites

  • E-Bahut

Bonjour Denis,

J'utilise également Thonny car ce qui m'a plus, c'est la possibilité d'avoir en plein écran et en côte à côte la partie programmation et la partie console. De plus, l'effaçage de la console par un simple clic n'est pas négligeable non plus. J'aurais bien aimé en plus avoir le possibilité d'effacer la console par une instruction en début de script mais j'ai beau chercher, je ne trouve pas l'information sur la toile.

Sinon, je fais aussi beaucoup comme toi pour les instructions, en particulier parce que je ne mémorise plus autant qu'avant les différentes syntaxes ou les possibilités des instructions que je suis amené à utiliser.

Lien vers le commentaire
Partager sur d’autres sites

  • E-Bahut
il y a 20 minutes, Denis CAMUS a dit :

Sacré Aloïs !

J'espère qu'on en est encore loin ! Mais si ça se trouve, le "tsar" va résoudre définitivement ce problème (et tous les autres) le 9 mai.

P.S. : hershel est venu sur le site il y a 13 h ? Si c'est le cas, ça aurait été sympa qu'il se manifeste.

Lien vers le commentaire
Partager sur d’autres sites

  • E-Bahut
Il y a 4 heures, julesx a dit :

 J'aurais bien aimé en plus avoir le possibilité d'effacer la console par une instruction en début de script mais j'ai beau chercher, je ne trouve pas l'information sur la toile.

C'est réclamé par pas mal de personnes et l'auteur dit que ce n'est pas évident à implémenter. Mais c'est dans les "à faire plus tard" :

https://groups.google.com/g/thonny/c/rwHElFfKYr0/m/y9i5bJm0AAAJ

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
×
×
  • Créer...
spam filtering
spam filtering