Pour expliquer pourquoi votre script ne fonctionne pas pour le moment, je renommerai la variable unsorted
en sorted
.
Au début, votre liste n'est pas encore triée. Bien sûr, nous nous sommes mis sorted
à False
.
Dès que nous démarrons la while
boucle, nous supposons que la liste est déjà triée. L'idée est la suivante: dès que l'on trouve deux éléments qui ne sont pas dans le bon ordre, on se sorted
remet False
. sorted
ne restera True
que s'il n'y avait pas d'éléments dans le mauvais ordre .
sorted = False # We haven't started sorting yet
while not sorted:
sorted = True # Assume the list is now sorted
for element in range(0, length):
if badList[element] > badList[element + 1]:
sorted = False # We found two elements in the wrong order
hold = badList[element + 1]
badList[element + 1] = badList[element]
badList[element] = hold
# We went through the whole list. At this point, if there were no elements
# in the wrong order, sorted is still True. Otherwise, it's false, and the
# while loop executes again.
Il existe également de petits problèmes mineurs qui aideraient le code à être plus efficace ou plus lisible.
Dans la for
boucle, vous utilisez la variable element
. Techniquement, ce element
n'est pas un élément; c'est un nombre représentant un index de liste. De plus, c'est assez long. Dans ces cas, utilisez simplement un nom de variable temporaire, comme i
pour "index".
for i in range(0, length):
La range
commande peut également prendre un seul argument (nommé stop
). Dans ce cas, vous obtenez une liste de tous les entiers de 0 à cet argument.
for i in range(length):
Le Guide de style Python recommande que les variables soient nommées en minuscules avec des traits de soulignement. C'est un petit pinaillage pour un petit script comme celui-ci; il s'agit davantage de vous habituer à ce à quoi ressemble le plus souvent le code Python.
def bubble(bad_list):
Pour permuter les valeurs de deux variables, écrivez-les sous forme d'affectation de tuple. Le côté droit est évalué comme un tuple (disons, (badList[i+1], badList[i])
est (3, 5)
) puis est assigné aux deux variables du côté gauche ( (badList[i], badList[i+1])
).
bad_list[i], bad_list[i+1] = bad_list[i+1], bad_list[i]
Mettez tout cela ensemble, et vous obtenez ceci:
my_list = [12, 5, 13, 8, 9, 65]
def bubble(bad_list):
length = len(bad_list) - 1
sorted = False
while not sorted:
sorted = True
for i in range(length):
if bad_list[i] > bad_list[i+1]:
sorted = False
bad_list[i], bad_list[i+1] = bad_list[i+1], bad_list[i]
bubble(my_list)
print my_list
(Au fait, j'ai également supprimé votre déclaration imprimée.)