Bouwsteen 3 — zoek vanaf een bepaalde positie
Leerdoel: je breidt de "vind index van kleinste"-functie uit zodat hij vanaf een gegeven startpositie zoekt — niet vanaf 0.
Waarom dit nodig is
Bij selection sort weet je na ronde k dat de eerste k elementen al
goed staan. Je wil niet opnieuw daarin zoeken — je weet al dat ze
goed zijn. Alleen het rest-stuk (vanaf index k) is interessant.
Wat we willen
index_van_kleinste_vanaf(lijst, start) — return de index van het
kleinste element in lijst[start:], maar wel uitgedrukt in indexen van
de hele lijst (niet vanaf 0 van het deel-stuk).
Voorbeeld: lijst = [1, 2, 8, 5, 4], start = 1:
- Zoekgebied:
[2, 8, 5, 4]— staat op indexen 1, 2, 3, 4 van de hele lijst. - Kleinste daarin: 2, op index 1.
Voorspel
Wat denk je dat dit print?
def index_van_kleinste_vanaf(lijst, start):
min_index = start
for i in range(start, len(lijst)):
if lijst[i] < lijst[min_index]:
min_index = i
return min_index
lijst = [1, 2, 8, 5, 4]
print(index_van_kleinste_vanaf(lijst, 0))
print(index_van_kleinste_vanaf(lijst, 1))
print(index_van_kleinste_vanaf(lijst, 2))
print(index_van_kleinste_vanaf(lijst, 3))
Antwoord
0
1
4
4
start=0→ zoek in hele lijst → 1 op index 0.start=1→ zoek in[2,8,5,4]→ 2 op index 1.start=2→ zoek in[8,5,4]→ 4 op index 4.start=3→ zoek in[5,4]→ 4 op index 4.
Run
Wat is nieuw?
Twee veranderingen ten opzichte van bouwsteen 1:
-
Startwaarde:
min_index = start(niet0). Anders zou de eerste iteratie meteen alles voorstartoverslaan — enlijst[0]als referentie gebruiken, wat fout is. -
Lus:
for i in range(start, len(lijst))— begin bijstart, ga tot het eind. Het skipt netjes de elementen voorstart.
Experimenteer — wat als start te groot is?
Wat doet start = 3 op een lijst van lengte 3?
min_index = 3— maarlijst[3]bestaat niet. Pas op: we proberen dat pas te lezen als de lus iets doet.range(3, 3)is leeg → de for-lus doet 0 iteraties.- We retourneren
min_index = 3zonder ooitlijst[3]aan te raken. Geen crash, maar wel een onzinnige index.
Voor selection sort is dit geen probleem — we roepen het nooit aan met
start == len(lijst). Maar als robuuste functie zou je eventueel een
check toevoegen.
Wat nu nog mist
We hebben alle ingrediënten:
- kleinste vinden vanaf positie (bouwsteen 3)
- swappen (bouwsteen 2)
Tijd om ze in een lus te zetten en zo de hele lijst te sorteren.
Door naar bouwsteen 4: de buitenste lus →