5.5 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.
Bouwsteen model
Zoeken vanaf start
Zoek het kleinste alleen in het ongesorteerde deel.
Zoek het kleinste element vanaf index 1.
De gesorteerde prefix blijft met rust; de scan begint pas bij i.
Input index_van_kleinste_vanaf([1, 2, 8, 5, 4], 0)
Verwacht 0
Input index_van_kleinste_vanaf([1, 2, 8, 5, 4], 2)
Verwacht 4
Input index_van_kleinste_vanaf([1, 2, 8, 5, 4], 3)
Verwacht 4
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.