Ga naar hoofdinhoud

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 →