Het complete algoritme
Leerdoel: je ziet alle bouwstenen samen en onderzoekt het algoritme.
Alles samen
def selection_sort(lijst):
n = len(lijst)
for i in range(n):
min_index = i
for j in range(i, n):
if lijst[j] < lijst[min_index]:
min_index = j
lijst[i], lijst[min_index] = lijst[min_index], lijst[i]
return lijst
- Regel 3:
Bouwsteen 4 — de buitenste lus: plek
ikrijgt deze ronde zijn definitieve waarde. - Regel 4-7:
Bouwstenen 1 + 3 — zoek de index van de kleinste, maar alleen vanaf positie
i: alles daarvóór staat al goed. - Regel 8:
Bouwsteen 2 — de swap zet de gevonden kleinste vooraan het ongesorteerde deel. Staat hij daar al (
min_index == i), dan ruilt de regel hem onschuldig met zichzelf.
Run
Interactief model
Selection sort
Kies steeds het kleinste van de rest en zet het vooraan.
Start
We zoeken telkens het kleinste element van het ongesorteerde deel.
Onderzoek
Probeer in elk geval:
- Sorteer een lijst met strings. Werkt dat?
- Sorteer een lijst met dubbele waardes. Wat gebeurt daarmee?
- Stabiliteit: sorteer leerlingen op hun cijfer. Twee leerlingen met hetzelfde cijfer: blijven die in de volgorde staan waarin ze in de lijst stonden?
Wat zie je?
- Strings komen alfabetisch te staan; Python kan ze met
<vergelijken. - Dubbele waardes komen naast elkaar te staan.
- Stabiliteit:
[(5, 'Noor'), (5, 'Bo'), (7, 'Ali'), (7, 'Sam')]. Sam stond vóór Ali, en staat nu erachter. Selection sort is niet stabiel: de swap in ronde 1 gooide Sam naar achteren, over Ali heen. Daarom vergelijkt de test alleen het cijfer (lijst[j][0]); vergelijk je de hele tuple, dan sorteert Python ook op naam en zie je hier niets.
Hoeveel werk doet dit?
| Lijstgrootte | Vergelijkingen | Swaps die iets verplaatsen |
|---|---|---|
| 5 | 15 | hoogstens 4 |
| 10 | 55 | hoogstens 9 |
| 100 | 5050 | hoogstens 99 |
| 1.000 | 500.500 | hoogstens 999 |
| 10.000 | 50.005.000 | hoogstens 9.999 |
Dit zijn de aantallen die de teller in de visualisatie ook laat zien.
Vergelijkingen groeien kwadratisch (n(n + 1)/2, ongeveer n²/2).
De swap-regel draait één keer per ronde, maar ruilt vaak een element met
zichzelf; wat er echt verhuist groeit lineair. Voor grote lijsten is
dat te traag: gebruik dan een beter sorteeralgoritme, zoals merge sort met
O(n log n).
Maar voor educatieve doeleinden en kleine lijsten is selection sort prima.
Door naar aanpassen.