Lösung Merge Sort
This commit is contained in:
parent
47d1217dcb
commit
88acfb9554
42
praktika/02_merge_sort/merge_game.py
Normal file
42
praktika/02_merge_sort/merge_game.py
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
import random
|
||||||
|
import pygame
|
||||||
|
from utils.algo_game import Game
|
||||||
|
from utils.algo_context import AlgoContext
|
||||||
|
from utils.algo_array import Array
|
||||||
|
from merge_sorting import merge_sort_stepwise
|
||||||
|
|
||||||
|
WHITE = (255, 255, 255)
|
||||||
|
BLUE = (0, 0, 255)
|
||||||
|
|
||||||
|
class MergeGame(Game):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__("Merge Game", fps=10, size=(400, 400))
|
||||||
|
random.seed()
|
||||||
|
l = list(range(1, 101))
|
||||||
|
random.shuffle(l)
|
||||||
|
self.ctx = AlgoContext()
|
||||||
|
self.z = Array(l, self.ctx)
|
||||||
|
self.finished = False
|
||||||
|
self.sort_generator = merge_sort_stepwise(self.z, self.ctx)
|
||||||
|
|
||||||
|
def update_game(self):
|
||||||
|
if not self.finished:
|
||||||
|
try:
|
||||||
|
next(self.sort_generator)
|
||||||
|
except StopIteration:
|
||||||
|
self.finished = True
|
||||||
|
return True
|
||||||
|
|
||||||
|
def draw_game(self):
|
||||||
|
self.screen.fill(WHITE)
|
||||||
|
for i, cell in enumerate(self.z):
|
||||||
|
x = 50 + i*3
|
||||||
|
y = 350 - cell.value * 3
|
||||||
|
pygame.draw.rect(self.screen, BLUE, (x, y, 3, 3))
|
||||||
|
super().draw_game()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
s = MergeGame()
|
||||||
|
s.run()
|
||||||
71
praktika/02_merge_sort/merge_sorting.py
Normal file
71
praktika/02_merge_sort/merge_sorting.py
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
from utils.algo_array import Array
|
||||||
|
from utils.algo_context import AlgoContext
|
||||||
|
from utils.algo_range import Range
|
||||||
|
from time import perf_counter as pfc
|
||||||
|
|
||||||
|
|
||||||
|
def merge_sort_stepwise(z: Array, ctx: AlgoContext, l=None, r=None, buffer=None):
|
||||||
|
if l is None:
|
||||||
|
l = 0
|
||||||
|
if r is None:
|
||||||
|
r = len(z) - 1
|
||||||
|
if buffer is None:
|
||||||
|
buffer = Array([0] * len(z), ctx)
|
||||||
|
if l < r:
|
||||||
|
m = (l + r) // 2
|
||||||
|
yield from merge_sort_stepwise(z, ctx, l, m, buffer)
|
||||||
|
yield from merge_sort_stepwise(z, ctx, m + 1, r, buffer)
|
||||||
|
yield from merge(z, ctx, l, m, r, buffer)
|
||||||
|
|
||||||
|
def merge(z: Array, ctx: AlgoContext, l: int, m: int, r: int, buffer: Array):
|
||||||
|
i, j, k = l, m + 1, l
|
||||||
|
while i <= m and j <= r:
|
||||||
|
if z[i] <= z[j]:
|
||||||
|
buffer[k] = z[i]
|
||||||
|
i += 1
|
||||||
|
else:
|
||||||
|
buffer[k] = z[j]
|
||||||
|
j += 1
|
||||||
|
k += 1
|
||||||
|
while i <= m:
|
||||||
|
buffer[k] = z[i]
|
||||||
|
i += 1
|
||||||
|
k += 1
|
||||||
|
while j <= r:
|
||||||
|
buffer[k] = z[j]
|
||||||
|
j += 1
|
||||||
|
k += 1
|
||||||
|
for k in Range(l, r + 1):
|
||||||
|
z[k] = buffer[k]
|
||||||
|
yield z
|
||||||
|
|
||||||
|
def merge_sort(z: Array, ctx: AlgoContext):
|
||||||
|
for _ in merge_sort_stepwise(z, ctx):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def sort_file(filename, sort_func):
|
||||||
|
ctx = AlgoContext()
|
||||||
|
z = Array.from_file(filename, ctx)
|
||||||
|
sort_func(z, ctx)
|
||||||
|
return z
|
||||||
|
|
||||||
|
def analyze_complexity(sort_func, sizes, presorted=False):
|
||||||
|
ctx = AlgoContext()
|
||||||
|
for size in sizes:
|
||||||
|
ctx.reset()
|
||||||
|
if presorted:
|
||||||
|
z = Array.sorted(size, ctx)
|
||||||
|
else:
|
||||||
|
z = Array.random(size, -100, 100, ctx)
|
||||||
|
sort_func(z, ctx)
|
||||||
|
ctx.save_stats(size)
|
||||||
|
|
||||||
|
ctx.plot_stats(["comparisons", "writes"])
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
analyze_complexity(merge_sort, [10, 20, 30, 40, 50, 60, 70, 80, 90, 100])
|
||||||
|
for filename in ["data/seq0.txt", "data/seq1.txt", "data/seq2.txt", "data/seq3.txt"]:
|
||||||
|
print(filename)
|
||||||
|
start = pfc()
|
||||||
|
print(sort_file(filename, merge_sort))
|
||||||
|
print(f"Dauer: {pfc() - start:.4f}s")
|
||||||
Loading…
x
Reference in New Issue
Block a user