6.11 Er gaat iets mis — top-3 fouten
Leerdoel: je herkent de klassieke valkuilen van bubble sort.
IndexError: range(len(lijst)) zonder - 1
IndexError: list index out of range
Oorzaak: bij de laatste iteratie is i = n - 1 → lijst[i + 1] = lijst[n] → bestaat niet → IndexError.
Oplossing: gebruik range(n - 1). Bij paarsgewijze vergelijkingen
(lijst[i] met lijst[i + 1]) is de laatste geldige i altijd één
minder dan de lijst-lengte.
# FOUT
def bubble_sort_fout(lijst):
n = len(lijst)
for ronde in range(n - 1):
for i in range(n): # te ver!
if lijst[i] > lijst[i + 1]: # crash bij i = n - 1
lijst[i], lijst[i + 1] = lijst[i + 1], lijst[i]
return lijst
# GOED
for i in range(n - 1): # nu loopt i tot n - 2
...
Meer uitleg: Bouwsteen 3 — één pass.
SyntaxError: = in plaats van ==
SyntaxError: invalid syntax
Oorzaak: = is toekenning, niet vergelijken. In een if-conditie
heb je een vergelijking nodig: ==, <, >, etc.
Oplossing: gebruik een vergelijking. Voor bubble sort gebruiken we
trouwens niet == maar > — want we willen weten of het paar fout
staat.
# FOUT
if lijst[i] = lijst[i + 1]:
...
# GOED
if lijst[i] > lijst[i + 1]:
...
Onthouden: één = is toekennen, twee == is vergelijken.
geswapt op de verkeerde plek initialiseren
Geen Python-foutmelding — wel een logische fout: de early-exit werkt niet of werkt verkeerd.
Oorzaak: 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.
Oplossing: zet geswapt = False binnen de buitenste lus, aan het
begin van elke pass. Algemener: bij elke pass die "iets nieuws" moet
detecteren, hoort de vlag op False aan het begin van die pass.
# FOUT
def bubble_sort_fout(lijst):
n = len(lijst)
geswapt = False # 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
# GOED
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
Door naar stap 12: cheatsheet.