Per spiegare perché il tuo script non funziona in questo momento, rinominerò la variabile unsorted
in sorted
.
Inizialmente, l'elenco non è stato ancora ordinato. Certo, ci siamo messi sorted
a False
.
Non appena iniziamo il while
ciclo, supponiamo che l'elenco sia già ordinato. L'idea è questa: non appena troviamo due elementi che non sono nel giusto ordine, sorted
torniamo a False
. sorted
rimarrà True
solo se non ci fossero elementi nell'ordine sbagliato .
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.
Ci sono anche piccoli piccoli problemi che potrebbero aiutare il codice a essere più efficiente o leggibile.
Nel for
ciclo, usi la variabile element
. Tecnicamente, element
non è un elemento; è un numero che rappresenta un indice di elenco. Inoltre, è piuttosto lungo. In questi casi, basta usare un nome di variabile temporaneo, come i
per "indice".
for i in range(0, length):
Il range
comando può anche prendere solo un argomento (chiamato stop
). In tal caso, si ottiene un elenco di tutti i numeri interi da 0 a tale argomento.
for i in range(length):
La Guida allo stile di Python raccomanda che le variabili siano nominate in minuscolo con caratteri di sottolineatura. Questo è un piccolo pignolo per una piccola sceneggiatura come questa; è più per abituarti a ciò che il codice Python assomiglia più spesso.
def bubble(bad_list):
Per scambiare i valori di due variabili, scriverli come assegnazione di tuple. Il lato destro viene valutato come una tupla (diciamo, (badList[i+1], badList[i])
è (3, 5)
) e quindi viene assegnato alle due variabili sul lato sinistro ( (badList[i], badList[i+1])
).
bad_list[i], bad_list[i+1] = bad_list[i+1], bad_list[i]
Metti tutto insieme e ottieni questo:
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
(A proposito, ho rimosso anche la tua dichiarazione di stampa.)