Lecture 7

This commit is contained in:
Oliver Hofmann
2024-06-13 13:57:30 +02:00
parent 00466b6ad7
commit 242b7fdc34
4 changed files with 139 additions and 10 deletions
+52
View File
@@ -0,0 +1,52 @@
from SoSe24.algodat.foundation import AlgoDatArray
class AlgoDatHeap():
def __init__(self, values: AlgoDatArray):
self.heap = values
self.size = len(values)
def left_child(self, i):
return 2*i + 1
def right_child(self, i):
return 2*i + 2
def parent(self, i):
return (i-1)//2
def max_heapify(self, i):
l = self.left_child(i)
r = self.right_child(i)
largest = i
if l <= self.size and self.heap[l-1] > self.heap[i-1]:
largest = l
if r <= self.size and self.heap[r-1] > self.heap[largest-1]:
largest = r
if largest != i:
self.heap[i-1], self.heap[largest-1] = self.heap[largest-1], self.heap[i-1]
self.max_heapify(largest)
def min_heapify(self, i):
l = self.left_child(i)
r = self.right_child(i)
smallest = i
if l <= self.size and self.heap[l-1] < self.heap[i-1]:
smallest = l
if r <= self.size and self.heap[r-1] < self.heap[smallest-1]:
smallest = r
if smallest != i:
self.heap[i-1], self.heap[smallest-1] = self.heap[smallest-1], self.heap[i-1]
self.min_heapify(smallest)
def build_max_heap(self):
for i in range(self.size//2, 0, -1):
self.max_heapify(i)
def build_min_heap(self):
for i in range(self.size//2, 0, -1):
self.min_heapify(i)
def as_list(self):
return [self.heap[i].value for i in range(self.size)]