Aanpassen — tel het aantal swaps
Leerdoel: je past bubble sort aan zodat hij naast de gesorteerde lijst ook het aantal swaps returnt.
Opdracht
Schrijf bubble_sort_met_swaps(lijst) die een tuple returnt
(gesorteerde_lijst, aantal_swaps).
bubble_sort_met_swaps([1, 2, 3])→([1, 2, 3], 0)bubble_sort_met_swaps([3, 2, 1])→([1, 2, 3], 3)bubble_sort_met_swaps([3, 1, 4, 1, 5])→([1, 1, 3, 4, 5], 3)
Code-omgeving wordt voorbereid…
Tip
Initialiseer swaps = 0 vóór de buitenste lus. Hoog swaps op met
1 bij elke swap. Return de lijst én swaps als tuple.
Antwoord
def bubble_sort_met_swaps(lijst):
n = len(lijst)
swaps = 0
for ronde in range(n - 1):
geswapt = False
for i in range(n - 1 - ronde):
if lijst[i] > lijst[i + 1]:
lijst[i], lijst[i + 1] = lijst[i + 1], lijst[i]
geswapt = True
swaps += 1
if not geswapt:
break
return lijst, swaps
Inversies — een wiskundig leuk feitje
Het aantal swaps dat bubble sort doet, is precies gelijk aan het
aantal inversies in de lijst — paren (i, j) met i < j maar
lijst[i] > lijst[j].
Voor [3, 1, 2]:
- (3, 1): 3 > 1 → inversie
- (3, 2): 3 > 2 → inversie
- (1, 2): 1 > 2 → niet
Twee inversies → twee swaps. Klopt!
Het idee: elke swap herstelt precies één inversie (twee buren die fout stonden). Daarom is het aantal swaps gelijk aan het aantal inversies.
Verifieer dit zelf
def aantal_inversies(lijst):
n = len(lijst)
inv = 0
for i in range(n):
for j in range(i + 1, n):
if lijst[i] > lijst[j]:
inv += 1
return inv
lijst = [3, 1, 4, 1, 5, 9, 2, 6]
print("inversies:", aantal_inversies(lijst.copy()))
print("bubble sort swaps:", bubble_sort_met_swaps(lijst.copy())[1])
Beide getallen zouden gelijk moeten zijn.
Door naar stap 10: bouw zelf →