Щоб пояснити, чому ваш сценарій не працює зараз, я перейменую цю змінну unsorted
в sorted
.
Спочатку ваш список ще не відсортований. Звичайно, ми налаштувались sorted
на False
.
Як тільки ми починаємо while
цикл, ми припускаємо, що список вже відсортований. Ідея така: як тільки ми знайдемо два елементи, які не в потрібному порядку, ми sorted
повертаємося до False
. sorted
залишиться True
лише в тому випадку, якщо не було елементів у неправильному порядку .
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.
Існують також незначні проблеми, які допоможуть коду бути більш ефективним чи читабельним.
У for
циклі ви використовуєте змінну element
. Технічно element
не є елементом; це число, що представляє індекс списку. Також досить довго. У цих випадках просто використовуйте тимчасову назву змінної, наприклад, i
для "індексу".
for i in range(0, length):
range
Команда також може прийняти тільки один аргумент ( з ім'ям stop
). У цьому випадку ви отримуєте список усіх цілих чисел від 0 до цього аргументу.
for i in range(length):
Керівництво Стиль Python рекомендує змінні названі в нижньому регістрі з підкресленням. Це дуже незначна нитка для такого маленького сценарію; це більше, щоб ви звикли до того, що найчастіше нагадує код Python.
def bubble(bad_list):
Щоб поміняти місцями значення двох змінних, запишіть їх як призначення кортежу. Права частина оцінюється як кортеж (скажімо, (badList[i+1], badList[i])
є (3, 5)
), а потім присвоюється двом змінним на лівій частині ( (badList[i], badList[i+1])
).
bad_list[i], bad_list[i+1] = bad_list[i+1], bad_list[i]
Зберіть все разом, і ви отримаєте це:
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
(До речі, я також видалив вашу заяву про друк.)