Er gaat iets mis — top-3 fouten
Leerdoel: je herkent de klassieke valkuilen van bubble sort.
1. range(len(lijst)) zonder - 1 in de binnenste lus
IndexError: list index out of range
Voorbeeld + uitleg
def bubble_sort_fout(lijst):
n = len(lijst)
for ronde in range(n - 1):
for i in range(n): # ← fout: moet n - 1 zijn
if lijst[i] > lijst[i + 1]: # crash bij i = n - 1
lijst[i], lijst[i + 1] = lijst[i + 1], lijst[i]
return lijst
bubble_sort_fout([3, 1, 4]) # IndexError
Bij de laatste iteratie is i = n - 1 → lijst[i + 1] = lijst[n] →
bestaat niet → IndexError.
Fix: gebruik range(n - 1). Onthouden: bij paarsgewijze
vergelijkingen (lijst[i] met lijst[i + 1]) is de laatste geldige i
altijd één minder dan de lijst-lengte.
for i in range(n - 1): # nu loopt i tot n - 2
...
2. = in plaats van == in de vergelijking
SyntaxError: invalid syntax
Voorbeeld + uitleg
if lijst[i] = lijst[i + 1]: # SyntaxError
...
= is toekenning, niet vergelijken. In een if-conditie heb je een
vergelijking nodig: ==, <, >, etc.
Fix: gebruik een vergelijking. Voor bubble sort:
if lijst[i] > lijst[i + 1]:
...
Onthouden: één = is toekennen, twee == is vergelijken. In bubble sort
gebruiken we trouwens niet == maar > — want we willen weten of het
paar fout staat.
3. geswapt op de verkeerde plek initialiseren
Geen Python-foutmelding — wel een logische fout: de early-exit werkt niet of werkt verkeerd.
Voorbeeld + uitleg
def bubble_sort_fout(lijst):
n = len(lijst)
geswapt = False # ← fout: VOOR de buitenste lus
for ronde in range(n - 1):
for i in range(n - 1 - ronde):
if lijst[i] > lijst[i + 1]:
lijst[i], lijst[i + 1] = lijst[i + 1], lijst[i]
geswapt = True
if not geswapt:
break
return lijst
Bug: geswapt wordt één keer geïnitialiseerd op False, en daarna
nooit meer gereset. Zodra er één swap gebeurt, blijft geswapt = True
voor alle verdere rondes. De early-exit gaat dan nooit meer af, ook
niet als een latere pass zonder swaps was.
Fix: zet geswapt = False binnen de buitenste lus, aan het begin
van elke pass:
for ronde in range(n - 1):
geswapt = False # ← elke pass opnieuw op False
for i in range(n - 1 - ronde):
if lijst[i] > lijst[i + 1]:
lijst[i], lijst[i + 1] = lijst[i + 1], lijst[i]
geswapt = True
if not geswapt:
break
Algemener: bij elke pass die "iets nieuws" moet detecteren, hoort de vlag
op False aan het begin van die pass gezet te worden.
Door naar stap 12: cheatsheet →