Para explicar por que seu script não está funcionando no momento, vou renomear a variável unsorted
para sorted
.
No início, sua lista ainda não está classificada. É claro que começamos sorted
a False
.
Assim que iniciamos o while
loop, assumimos que a lista já está classificada. A idéia é a seguinte: assim que encontrarmos dois elementos que não estão na ordem correta, sorted
voltamos a False
. sorted
permanecerá True
apenas se não houver elementos na ordem errada .
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.
Também existem pequenos problemas que ajudariam o código a ser mais eficiente ou legível.
No for
loop, você usa a variável element
. Tecnicamente, element
não é um elemento; é um número que representa um índice de lista. Além disso, é bastante longo. Nesses casos, basta usar um nome de variável temporário, como i
para "índice".
for i in range(0, length):
O range
comando também pode receber apenas um argumento (nomeado stop
). Nesse caso, você obtém uma lista de todos os números inteiros de 0 a esse argumento.
for i in range(length):
O Guia de Estilo do Python recomenda que as variáveis sejam nomeadas em minúsculas com sublinhados. Este é um detalhe muito pequeno para um pequeno script como este; é mais para você se acostumar com o que o código Python mais se assemelha.
def bubble(bad_list):
Para trocar os valores de duas variáveis, escreva-as como uma atribuição de tupla. O lado direito é avaliado como uma tupla (por exemplo, (badList[i+1], badList[i])
é (3, 5)
) e, em seguida, é atribuído às duas variáveis no lado esquerdo ( (badList[i], badList[i+1])
).
bad_list[i], bad_list[i+1] = bad_list[i+1], bad_list[i]
Coloque tudo junto e você terá o seguinte:
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 propósito, também removi sua declaração impressa.)