Browse Source

Lecture 2

master
Oliver Hofmann 6 months ago
parent
commit
93c4fb91e5
1 changed files with 10 additions and 10 deletions
  1. 10
    10
      SoSe24/lec03_sort_alg/merge_sort.py

+ 10
- 10
SoSe24/lec03_sort_alg/merge_sort.py View File

from SoSe24.algodat.foundation import AlgoDatArray, AlgoDatValue, read_int_sequence, MinusInf
from SoSe24.algodat.foundation import AlgoDatArray, AlgoDatValue, read_int_sequence
from time import perf_counter as pfc from time import perf_counter as pfc




def merge_sort(z: AlgoDatArray, storage: AlgoDatArray, left: int, right: int):
def merge_sort(z: AlgoDatArray, buffer: AlgoDatArray, left: int, right: int):
if left == right: if left == right:
return return
mid = (left + right) // 2 mid = (left + right) // 2
merge_sort(z, storage, left, mid)
merge_sort(z, storage, mid+1, right)
merge_sort(z, buffer, left, mid)
merge_sort(z, buffer, mid + 1, right)
left_ptr = left left_ptr = left
right_ptr = mid+1 right_ptr = mid+1
storage_ptr = left storage_ptr = left
while left_ptr <= mid or right_ptr <= right: while left_ptr <= mid or right_ptr <= right:
if left_ptr <= mid and right_ptr <= right: if left_ptr <= mid and right_ptr <= right:
if z[left_ptr] < z[right_ptr]: if z[left_ptr] < z[right_ptr]:
storage[storage_ptr].value = z[left_ptr].value
buffer[storage_ptr].value = z[left_ptr].value
left_ptr += 1 left_ptr += 1
storage_ptr += 1 storage_ptr += 1
else: else:
storage[storage_ptr].value = z[right_ptr].value
buffer[storage_ptr].value = z[right_ptr].value
right_ptr += 1 right_ptr += 1
storage_ptr += 1 storage_ptr += 1
elif left_ptr <= mid: elif left_ptr <= mid:
storage[storage_ptr].value = z[left_ptr].value
buffer[storage_ptr].value = z[left_ptr].value
left_ptr += 1 left_ptr += 1
storage_ptr += 1 storage_ptr += 1
else: else:
storage[storage_ptr].value = z[right_ptr].value
buffer[storage_ptr].value = z[right_ptr].value
right_ptr += 1 right_ptr += 1
storage_ptr += 1 storage_ptr += 1
for i in range(left, right): for i in range(left, right):
z[i].value = storage[i].value
z[i].value = buffer[i].value




if __name__ == "__main__": if __name__ == "__main__":
z = read_int_sequence("../../seq0.txt") z = read_int_sequence("../../seq0.txt")
print(z, len(z)) print(z, len(z))
start = pfc() start = pfc()
storage = AlgoDatArray(z.size) # Zwischenspeicher
storage = AlgoDatArray(z.size) # buffer
AlgoDatValue.summary() AlgoDatValue.summary()
merge_sort(z, storage, 0, z.size-1) merge_sort(z, storage, 0, z.size-1)
print(z) print(z)

Loading…
Cancel
Save