From f55b69af920152439ca5c629b2f4fb572b59d1db Mon Sep 17 00:00:00 2001 From: Parseluni Date: Wed, 24 Nov 2021 21:29:06 -0800 Subject: [PATCH 1/2] Completed --- heaps/heap_sort.py | 18 +++++++++++++---- heaps/min_heap.py | 45 ++++++++++++++++++++++++++++++++++-------- tests/test_heapsort.py | 3 +++ 3 files changed, 54 insertions(+), 12 deletions(-) diff --git a/heaps/heap_sort.py b/heaps/heap_sort.py index 3b834a5..19b5cc1 100644 --- a/heaps/heap_sort.py +++ b/heaps/heap_sort.py @@ -1,8 +1,18 @@ - +from heaps.min_heap import MinHeap def heap_sort(list): """ This method uses a heap to sort an array. - Time Complexity: ? - Space Complexity: ? + Time Complexity: O(n log n) + Space Complexity: O(n) """ - pass \ No newline at end of file + heap = MinHeap() + + for num in list: + heap.add(num) + + index = 0 + while not heap.empty(): + list[index] = heap.remove() + index += 1 + + return list \ No newline at end of file diff --git a/heaps/min_heap.py b/heaps/min_heap.py index 0095872..4303a3b 100644 --- a/heaps/min_heap.py +++ b/heaps/min_heap.py @@ -11,12 +11,11 @@ def __repr__(self): return str(self.value) - class MinHeap: def __init__(self): self.store = [] - + self.size = 0 def add(self, key, value = None): """ This method adds a HeapNode instance to the heap @@ -24,7 +23,12 @@ def add(self, key, value = None): Time Complexity: ? Space Complexity: ? """ - pass + if value == None: + value = key + + self.store.append(HeapNode(key, value)) + self.heap_up(len(self.store) - 1) + self.size += 1 def remove(self): """ This method removes and returns an element from the heap @@ -32,10 +36,17 @@ def remove(self): Time Complexity: ? Space Complexity: ? """ - pass + if self.empty(): + return None + + self.swap(0, len(self.store) - 1) + min_node = self.store.pop() + self.heap_down(0) + self.size -= 1 + + return min_node.value - def __str__(self): """ This method lets you print the heap, when you're testing your app. """ @@ -49,7 +60,7 @@ def empty(self): Time complexity: ? Space complexity: ? """ - pass + return self.size == 0 def heap_up(self, index): @@ -62,7 +73,12 @@ def heap_up(self, index): Time complexity: ? Space complexity: ? """ - pass + parent_node_index = (index - 1) // 2 + + if index: + if self.store[index].key < self.store[parent_node_index].key: + self.swap(index, parent_node_index) + self.heap_up(parent_node_index) def heap_down(self, index): """ This helper method takes an index and @@ -70,7 +86,20 @@ def heap_down(self, index): larger than either of its children and continues until the heap property is reestablished. """ - pass + left_child = 2 * index + 1 + right_child = 2 * index + 2 + + if left_child < len(self.store): + if right_child >= len(self.store): + min_child = left_child + elif self.store[left_child].key < self.store[right_child].key: + min_child = left_child + else: + min_child = right_child + + if self.store[index].key > self.store[min_child].key: + self.swap(index, min_child) + self.heap_down(min_child) def swap(self, index_1, index_2): diff --git a/tests/test_heapsort.py b/tests/test_heapsort.py index 51b0c2e..5519045 100644 --- a/tests/test_heapsort.py +++ b/tests/test_heapsort.py @@ -1,3 +1,6 @@ +""" +O(n log n) +""" from heaps.heap_sort import heap_sort def test_it_sorts_an_empty_list(): From 09c889a5005a4de3dc81d1282cabe086fa0983d4 Mon Sep 17 00:00:00 2001 From: Parseluni Date: Wed, 24 Nov 2021 21:33:56 -0800 Subject: [PATCH 2/2] Big O added --- heaps/min_heap.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/heaps/min_heap.py b/heaps/min_heap.py index 4303a3b..3559607 100644 --- a/heaps/min_heap.py +++ b/heaps/min_heap.py @@ -20,8 +20,8 @@ def __init__(self): def add(self, key, value = None): """ This method adds a HeapNode instance to the heap If value == None the new node's value should be set to key - Time Complexity: ? - Space Complexity: ? + Time Complexity: O(log n) + Space Complexity: O(1) """ if value == None: value = key @@ -33,8 +33,8 @@ def add(self, key, value = None): def remove(self): """ This method removes and returns an element from the heap maintaining the heap structure - Time Complexity: ? - Space Complexity: ? + Time Complexity: O(log n) + Space Complexity: O(1) """ if self.empty(): return None @@ -57,8 +57,8 @@ def __str__(self): def empty(self): """ This method returns true if the heap is empty - Time complexity: ? - Space complexity: ? + Time complexity: O(1) + Space complexity: O(1) """ return self.size == 0 @@ -70,8 +70,8 @@ def heap_up(self, index): property is reestablished. This could be **very** helpful for the add method. - Time complexity: ? - Space complexity: ? + Time complexity: O(log n) + Space complexity: O(1) """ parent_node_index = (index - 1) // 2