Ga naar hoofdinhoud

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 - 1lijst[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 →