Lecture 7
This commit is contained in:
@@ -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)]
|
||||
Reference in New Issue
Block a user