Tri À Bulles Devoirs
Dans la classe, nous faisons algorithmes de tri et, même si je comprends bien quand on parle de l'écriture de pseudo, j'ai des problèmes de l'écriture de code pour eux.
C'est ma tentative en Python:
mylist = [12, 5, 13, 8, 9, 65]
def bubble(badList):
length = len(badList) - 1
unsorted = True
while unsorted:
for element in range(0,length):
unsorted = False
if badList[element] > badList[element + 1]:
hold = badList[element + 1]
badList[element + 1] = badList[element]
badList[element] = hold
print badList
else:
unsorted = True
print bubble(mylist)
Maintenant, c' (autant que je puisse en dire) trie correctement, mais une fois qu'il termine juste en boucle.
Comment ce code peut être fixé de sorte que la fonction se termine correctement et correctement trie une liste de tout (raisonnable) taille?
P. S. je sais que je ne devrait pas vraiment s'imprime dans une fonction, et je devrais avoir un retour, mais je n'ai pas encore fait car mon code ne fonctionne pas vraiment encore.
- eggg, j'ai utilisé pascal pour cette école secondaire, et il n'y avait pas internet pour demander de l'aide, et c'était l'hiver, et.... bonne chance!
- Je pensais que c'était une reconnaissance de l'erreur. Pas une question.
- dieu, ce qui m'énerve. Pourquoi ont-ils même enseigner une valeur algorithme de ce genre dans la première place. Pas de frapper à la question, qui en est la source.
- Doit-il obtenir de votre pelouse?
- Le poste est en substance: "j'ai des problèmes de codage, c'est ce que j'ai fait, ça ne fonctionne pas." Il y a évidemment un implicite "quelqu'un Peut-il me donner quelques conseils s'il vous plaît?" Contrairement à de nombreux devoirs des questions, celui-ci (un) est bien écrit, (b) est franc au sujet d'être les devoirs, et (c) comprend une bonne tentative de résoudre le problème. Je ne pense pas que l'absence d'une réelle interrogation porte atteinte aussi grandement..
- Davison - Même si elles pourraient probablement utiliser un meilleur algorithme, je pense que le point entier de ce qui est d'amener les élèves à commencer à penser à la façon dont les algorithmes de travail et la façon d'écrire un algorithme.
- Tri à bulles est utilisé comme un outil d'apprentissage parce que c'est la méthode la plus simple algorithme de tri pour la plupart des gens à comprendre. C'est un bon point d'entrée pour l'apprentissage sur le tri et algorithmes en général. Si nous n'en avons appris des choses que les gens pourraient utiliser, la discussion de tri aurait de début et de fin avec "l'utilisation de la bibliothèque de la routine de tri".
- Cette question est une affiche-enfant pour savoir comment demander à un des "devoirs" des questions. Jean Fouhy point, il y a un exemple de code, il est bien écrit, et l'affiche est d'essayer dur pour le rendre facile pour nous pour les aider. Bien fait, joshhunt.
- Tri à bulles n'est pas un simple algorithme de tri pour les gens de comprendre. À partir de mon expérience personnelle et de l'expérience en enseignement, je peux dire avec confiance que le tri par insertion, tri de sélection, min-tri (élément minimum de tri), même (pour certains élèves) mergesort et quicksort sont plus facile à comprendre, après tout, ils correspondent à un peu manières naturelles de tri d'une liste, mais de tri à bulles est juste artificielle. En outre, tri à bulles est sujette à de nombreux tout-en-un d'erreurs et de boucle infinie des erreurs, comme cette question ici. Comme Knuth dit, "le tri à bulles semble ne rien avoir à le recommander, à l'exception d'un nom accrocheur..."
- Je suis en train d'imaginer la personne qui doit exister, selon ShreevatsaR, qui, après s'être introduit dans le concept de tri, pense que quicksort est plus simple à comprendre que bubblesort. Les gens de l'apprentissage de code serait plutôt mâcher leurs propres pieds que d'essayer de comprendre un algorithme récursif.
- Beska, je pense que la récursivité lui-même est naturel et beau, au moins pour certains.
- Pour certains, c'est "nudisme", pour d'autres, c'est "pourquoi le gars gras nu? Exécuter!"
- Si vous avez un moment difficile la compréhension de tri à bulles, puis je ne suis pas surpris que vos élèves ont du mal à le comprendre ainsi. Qui ne semble pas être une bonne série de points de données pour construire une argumentation sur. Knuth a parlé de la complexité du tri à bulles quand il a écrit le passage que vous avez cité (pg. 110 de Vol. 3, TAoCP), pas comment facile ou difficile à comprendre. En fait, à la page 106, il dit "peut-être le moyen le plus évident de trier par des échanges..." pour introduire de tri à bulles.
- Je comprends tri à bulles parfaitement bien (et donc la plupart des étudiants, en fin de compte; ma plainte, c'est qu'il n'est pas d'un naturel algorithme, si le code est court. Essayez cette expérience: donner aux étudiants quelques 40 cartes et demandez-leur de les trier. Ils vous lancer au hasard, au premier abord, mais bientôt ils vont soit: (i) choisir la plus petite à chaque fois et l'ajouter (sélection tri / minsort), ou (ii) mettre chaque carte dans sa "bonne" position (le tri par insertion). Je n'ai jamais vu quelqu'un tri dans plusieurs passages de l'échange uniquement les éléments adjacents. Le maintien d'un invariant inductif ne vient pas naturellement.
- Et certains élèves arrivent à l'équivalent de mergesort ou quicksort. Il peut bien être "peut-être le moyen le plus évident de trier par des échanges", mais de tri par des échanges n'est pas naturel. 🙂 Voir aussi "tri à Bulles: une archéologie de l'algorithmique analyse" par Owen Astrachan (prophet.cs.duke.edu/~llo/documents/bulle.pdf / cs.duke.edu/~ola/bubble/bubble.html ). Il n'y a aucune bonne raison pour enseigner le tri à bulles en premier: "La bulle de l'algorithme de tri n'est pas très utile dans la pratique, puisqu'il s'exécute plus lentement que l'insertion de tri et de sélection, de tri, de est encore plus compliqué à programmer."
- Ne pensez-vous pas que votre expérience de biaiser les résultats un peu? Si vous avez la main à quelqu'un de 40 cartes et demandez-leur d'en faire le tri, n'est-ce pas naturellement de tri de manière à ce qu'ils sont habitués à le tri de cartes (à partir de la carte à jouer à des jeux)? Tri de la sélection et le tri par insertion sont à la fois des moyens naturels pour ce faire. Comment font les gens naturellement les choses quand ils ne peuvent pas déplacer physiquement dans leurs mains?
- Je me demande si la véritable raison de tri à bulles est généralement enseigné la première est de sorte que l'enseignant peut montrer une progression de l'amélioration de complexité algorithmes de tri? Mon algorithmes professeur a commencé avec bogosort en.wikipedia.org/wiki/Bogosort comme un exemple, et chacun, il a appris après que c'était une amélioration par rapport à la précédente.
- Oui, j'ai utilisé "naturel" dans le sens de "motivés": quelque chose que les étudiants peuvent venir par eux-mêmes (avec un peu de coup de coude, ou à partir de l'analogie avec le tri des objets physiques). Je n'ai rien contre lent et inefficace O(n^2) algorithmes de tri d'être la première à ceux qui sont enseignés, tout contre l'idée fausse que le tri à bulles est plus facile à comprendre (pas corroborée par des preuves!). Par exemple, essayez de demander à des étudiants à propos de la boucle de résiliation des conditions de tri à bulles: c'est plus subtile et plus difficile à comprendre que les autres O(n^2) sortes, et semble être étonnamment difficile à coder correctement.
Vous devez vous connecter pour publier un commentaire.
Pour expliquer pourquoi votre script ne fonctionne pas, je vais renommer la variable
unsorted
àsorted
.Au premier abord, votre liste n'est pas encore triées. Bien sûr, nous avons mis en
sorted
àFalse
.Dès que nous commençons à le
while
boucle, nous supposons que la liste est déjà triée. L'idée est la suivante: dès que nous trouvons deux éléments qui ne sont pas dans le bon ordre, nous avons mis ensorted
retour àFalse
.sorted
resteraTrue
seulement si il n'y avait pas d'éléments dans le mauvais ordre.Il y a aussi des mineurs peu des questions susceptibles d'aider à ce que le code sera plus efficace ou plus lisible.
Dans le
for
boucle, vous utilisez la variableelement
. Techniquement,element
n'est pas un élément; c'est un nombre qui représente un indice de la liste. Aussi, c'est assez long. Dans ces cas, il suffit d'utiliser une variable temporaire nom, commei
pour "index".La
range
commande peut aussi ne prendre qu'un seul argument (nomméstop
). Dans ce cas, vous obtenez une liste de tous les entiers de 0 à cet argument.La Python Guide De Style recommande de nommage des variables en minuscules avec des traits de soulignement. C'est un très mineur pinaille pour un petit script comme ça, c'est plus pour vous permettre de vous familiariser à ce que le code Python le plus souvent ressemble.
Pour permuter les valeurs de deux variables, écrire comme un n-uplet d'affectation. La main droite est évaluée comme un n-uplet (dire,
(badList[i+1], badList[i])
est(3, 5)
) et obtient ensuite assignés à deux variables sur le côté gauche ((badList[i], badList[i+1])
).Mettre tout cela ensemble, et vous obtenez ceci:
(J'ai enlevé votre rapport d'impression trop, d'ailleurs.)
bubble
trie la liste en place et ne retourne rien. Par conséquent, le tri de la liste et l'affichage, il est maintenant effectuée séparément.while
boucle, la plus grande partie des "bulles" à la fin de la liste. En tant que tel, après une itération, le dernier élément est certainement au bon endroit (et ne sera pas déplacé par itérations successives). En soustrayant 1 de longueur, vous êtes l'optimisation de l'algorithme que de tri de la sous-liste qui n'est pas encore triées (lelength-n
au premier plan les éléments de la liste). J'ai choisi d'ignorer cette optimisation, comme c'est plus une optimisation que d'une partie essentielle de l'algorithme.Put it all together, and you get this:
...eh bien,vous avez raté celui-ci:The range command can also take just one argument (named stop).
Le but de tri à bulles est de déplacer le plus lourd les éléments du bas à chaque tour, tout en déplaçant les plus léger éléments en place. Dans l'intérieur de la boucle, où vous comparer les éléments, vous n'avez pas à la parcourir toute la liste à chaque tour. Le plus lourd est déjà placé en dernier. Le échangé variable est un supplément de vérifier si nous pouvons marquer que la liste est triée et éviter de prolonger inutilement les calculs.
Votre version 1, corrigé:
C'est ce qui arrive lorsque vous utilisez le nom de la variable de signification négative, vous devez inverser leurs valeurs. La suite serait plus facile à comprendre:
D'autre part, la logique de l'algorithme est un peu à l'écart. Vous devez vérifier si deux éléments échangés au cours de la boucle for. Voici comment j'allais l'écrire:
Votre utilisation de la non Triés variable est faux; vous voulez avoir une variable qui vous indique si vous avez échangé deux éléments; si vous avez terminé, vous pouvez quitter votre boucle, sinon, vous avez besoin de boucle à nouveau. Pour corriger ce que vous avez ici, il suffit de mettre le "non triés = false" dans le corps de votre cas; supprimer votre cas d'autre; et de mettre "non triés = true avant votre
for
boucle.#Une fonction très simple, peut être optimisé (évidemment) par la diminution de l'espace du problème de la 2ème tableau. Mais même O(n^2) complexité.
arr[a], arr[b] = arr[b], arr[a]
Vous avez un couple d'erreurs là-bas. Le premier est dans la longueur, et le second, dans votre utilisation de non triés (comme indiqué par McWafflestix). Vous avez sans doute aussi envie de retourner la liste si vous allez imprimer:
eta: Vous avez raison, le ci-dessus est buggé comme l'enfer. Mon mauvais pour ne pas tester à travers quelques exemples.
Je suis un frais frais débutant, a commencé à lire à propos de Python hier.
Inspiré par votre exemple, j'ai créé quelque chose peut-être plus dans les années 80-les liens de style, mais néanmoins ça fonctionne
Le problème avec l'algorithme original est que si vous avez un nombre inférieur de plus dans la liste, il ne serait pas l'amener à la bonne position assortie. Le programme doit retourner le début à chaque fois pour s'assurer que les numéros de trier tout le chemin à travers.
J'ai simplifié le code et il va maintenant travailler pour un numéro de la liste, indépendamment de la liste et même si il y a la répétition des nombres. Voici le code
accédez à la liste = [54,26,93,17,77,31,44,55,20,-23,-34,16,11,11,11]
impression bubbleSort(accédez à la liste)
Un exemple plus simple:
Cela prend simplement les éléments de 0 à un(en fait, tous les éléments non triés lors de la ronde) et la compare avec son élément adjacent, et de faire un swap si elle est supérieure à celle de son élément adjacent. À la fin de la ronde, le dernier élément est trié, et le processus s'exécute à nouveau sans elle, jusqu'à ce que tous les éléments ont été triés.
Il n'est pas nécessaire pour une condition si
sort
est vrai ou pas.Noter que cet algorithme prend en considération la position des numéros seulement lors de l'échange, de sorte chiffres répétés ne l'affectera pas.
PS. Je sais qu'il a été très longtemps puisque cette question a été posté, mais je voulais juste partager cette idée.
Je envisager d'ajouter ma solution, car jamais de solution ici est d'avoir
puis est devrait être
Donc, voici ma solution:
Les réponses fournies par la fureur et Martin Cote fixe le problème de la boucle infinie, mais mon code ne serait pas travailler correctement (pour une liste plus exhaustive, il ne serait pas trier correctement.). J'ai fini par abandonner
unsorted
variable et utilisé un compteur à la place.Si quelqu'un pouvait fournir tous les pointeurs sur la façon d'améliorer mon code dans les commentaires, il serait très apprécié.
Essayer cette
idk si cela peut vous aider, après 9 ans...
ses un simple tri à bulles programme
def bubbleSort(a):
def swap(x, y):
temp = a[x]
a[x] = a[y]
a[y] = temp
#outer loop
for j in range(len(a)):
#slicing to the center, inner loop, python style
for i in range(j, len(a) - j):
#find the min index and swap
if a[i] < a[j]:
swap(j, i)
#find the max index and swap
if a[i] > a[len(a) - j - 1]:
swap(len(a) - j - 1, i)
return a