Er gaat iets mis — top-3 fouten
Leerdoel: je herkent de klassieke valkuilen bij selection sort.
1. Zoeken vanaf index 0 in plaats van vanaf i
Geen Python-foutmelding — wél een stille fout: de al-gesorteerde elementen vooraan worden door nieuwe swaps overschreven.
Voorbeeld + uitleg
def selection_sort_fout(lijst):
n = len(lijst)
for i in range(n):
min_index = 0 # ← fout: moet 'i' zijn
for j in range(0, n): # ← fout: moet 'range(i, n)' zijn
if lijst[j] < lijst[min_index]:
min_index = j
lijst[i], lijst[min_index] = lijst[min_index], lijst[i]
return lijst
print(selection_sort_fout([5, 2, 8, 1, 4])) # totaal kapot resultaat
Wat gaat er mis? Elke ronde zoek je nog steeds in de hele lijst — ook
in het al gesorteerde stuk vooraan. En je swapt met lijst[i], wat een
al-gesorteerde plek kan zijn. Het sorted-stuk wordt vernield.
Fix: zoek vanaf i en begin de zoektocht met min_index = i. Zo
laat je het al-gesorteerde deel met rust.
for i in range(n):
min_index = i
for j in range(i, n):
...
2. Verkeerde swap — informatie verliezen
lijst[a] = lijst[b]
lijst[b] = lijst[a]
Voorbeeld + uitleg
lijst = [5, 2, 8, 1, 4]
a, b = 0, 3
lijst[a] = lijst[b] # lijst[0] wordt 1; de 5 is weg
lijst[b] = lijst[a] # lijst[3] wordt 1 (alweer)
print(lijst) # [1, 2, 8, 1, 4] — de 5 is weg, de 1 staat dubbel
Bug: na de eerste toekenning is de oude waarde van lijst[a] weg —
overschreven met lijst[b]. De tweede regel gebruikt de nieuwe
waarde van lijst[a], niet de oude.
Fix 1: gebruik een tijdelijke variabele.
tijdelijk = lijst[a]
lijst[a] = lijst[b]
lijst[b] = tijdelijk
Fix 2 (Pythonisch): tuple-swap.
lijst[a], lijst[b] = lijst[b], lijst[a]
Beide werken — kies bewust.
3. range(0, n) in plaats van range(i, n) in de binnenste lus
Geen Python-foutmelding — werkt toevallig soms, maar de logica klopt niet.
Voorbeeld + uitleg
for i in range(n):
min_index = i
for j in range(0, n): # ← begint bij 0, kijkt ook al-gesorteerd terug
if lijst[j] < lijst[min_index]:
min_index = j
lijst[i], lijst[min_index] = lijst[min_index], lijst[i]
Probleem: in ronde i = 2 kijken we óók nog naar lijst[0] en lijst[1].
Maar die zijn al gesorteerd — daar zou het kleinste element van het hele
ongesorteerde stuk niet meer kunnen liggen.
Wat kan misgaan: lijst[0] (de allerkleinste, al op zijn plek) is
kleiner dan alles in het ongesorteerde stuk → min_index = 0 → swap met
lijst[2]. Het sorted-stuk wordt vernield, net als bij fout 1.
Fix: for j in range(i, n). Alleen het ongesorteerde stuk doorzoeken.
Door naar stap 11: cheatsheet →