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.

InformationsquelleAutor Josh Hunt | 2009-05-21