Правило пузырька: сравнивать можно только соседей и менять их местами при нарушении порядка.
Если идти слева направо, максимум выигрывает каждое следующее сравнение и уезжает в конец. Значит, после одного прохода максимальный элемент стоит на своём месте. Проходов нужно N − 1, и каждый следующий короче на i: готовый хвост перепроверять незачем.
Флаг swapped даёт досрочный выход: если за целый проход не было ни одного обмена, список уже упорядочен.
a = [5, 1, 4, 2, 8, 3]
n = len(a)
for i in range(n - 1):
swapped = False
for j in range(n - 1 - i):
if a[j] > a[j + 1]:
a[j], a[j + 1] = a[j + 1], a[j]
swapped = True
if not swapped:
break
print(a)
# [1, 2, 3, 4, 5, 8]
Ловушки:
range(n)вместоrange(n - 1 - i)– на последней пареa[j + 1]вылезет за конец списка, программа упадёт сIndexError.>=вместо>– лишние обмены на равных элементах и потеря устойчивости.