Bouwsteen 4 — herhalen tot het klopt
Leerdoel: je verpakt de "één pass"-logica in een buitenste lus die genoeg keer herhaalt om de hele lijst te sorteren.
Hoe vaak moet je herhalen?
Per pass komt het grootste-van-de-rest naar achteren. Voor n elementen
zijn n − 1 passes altijd genoeg: staat de rest goed, dan staat het
laatste element vanzelf ook goed.
for ronde in range(len(lijst) - 1):
for i in range(len(lijst) - 1):
if lijst[i] > lijst[i + 1]:
lijst[i], lijst[i + 1] = lijst[i + 1], lijst[i]
Voorspel
Wat denk je dat dit print?
def bubble_sort_basis(lijst):
n = len(lijst)
for ronde in range(n - 1):
for i in range(n - 1):
if lijst[i] > lijst[i + 1]:
lijst[i], lijst[i + 1] = lijst[i + 1], lijst[i]
return lijst
print(bubble_sort_basis([3, 1, 4, 1, 5]))
print(bubble_sort_basis([5, 4, 3, 2, 1]))
print(bubble_sort_basis([1, 2, 3, 4, 5]))
Antwoord
[1, 1, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
Alle drie gesorteerd.
Run
Een kleine optimalisatie
Na ronde k staan de laatste k elementen al goed. We hoeven dus niet
elke ronde tot het einde te kijken — we kunnen één positie eerder stoppen
per ronde:
for ronde in range(n - 1):
for i in range(n - 1 - ronde): # steeds 1 minder
...
Dat scheelt werk zonder dat de logica verandert: de staart die al goed staat laat je met rust.
Wat nu nog mist
Op een lijst die al gesorteerd is doet dit nog steeds n − 1 passes, en
dat is verspild werk: zodra een ronde geen enkele swap doet, is de lijst
klaar. Die vroege uitstap bouw je in de volgende stap.
Door naar bouwsteen 5: early-exit.