From 732677c3472a952c2112e283148cd91bbcc16654 Mon Sep 17 00:00:00 2001 From: rpeeples Date: Wed, 28 Sep 2022 12:00:02 -0400 Subject: [PATCH 1/3] heaps --- heaps/heap_sort.py | 15 ++++++++++--- heaps/min_heap.py | 54 +++++++++++++++++++++++++++++++--------------- 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/heaps/heap_sort.py b/heaps/heap_sort.py index 3b834a5..2acbd4e 100644 --- a/heaps/heap_sort.py +++ b/heaps/heap_sort.py @@ -1,8 +1,17 @@ +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(1) """ - pass \ No newline at end of file + heap = MinHeap() + for value in list: + heap.add(list) + index = 0 + while not heap.empty(): + value[index] = heap.remove() + index += 1 + return value + \ No newline at end of file diff --git a/heaps/min_heap.py b/heaps/min_heap.py index f6fe4e0..97a712a 100644 --- a/heaps/min_heap.py +++ b/heaps/min_heap.py @@ -19,20 +19,24 @@ 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 extra space is available """ - pass + if value == None: + value = key + + node = HeapNode(key, value) + self.store.append(node) + self.heap_up(len(self.store) - 1) 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) """ - pass - - + if len(self.store) == 0: + return None def __str__(self): """ This method lets you print the heap, when you're testing your app. @@ -44,11 +48,10 @@ 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) """ - pass - + return not self.store def heap_up(self, index): """ This helper method takes an index and @@ -57,10 +60,17 @@ 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) """ - pass + if index == 0: + return + + parent = (index -1 ) // 2 + store = self.store + if store[parent].key > store[index].key: + self.swap(parent, index) + self.heap_up(parent) def heap_down(self, index): """ This helper method takes an index and @@ -68,9 +78,19 @@ def heap_down(self, index): larger than either of its children and continues until the heap property is reestablished. """ - pass + left = index * 2 + 1 + right = index * 2 + 2 + store = self.store + if left < len(self.store): + if right < len(self.store): + if store[left].key < store[right].key: + smaller_value = left + else: + smaller_value = right + if store[index].key > store[smaller_value].key: + self.swap(index, smaller_value) + self.heap_down(smaller_value) - def swap(self, index_1, index_2): """ Swaps two elements in self.store at index_1 and index_2 From b6d8734c6ad40def076beb1f5a4a1d34f31fe5c9 Mon Sep 17 00:00:00 2001 From: rpeeples Date: Thu, 29 Sep 2022 13:28:37 -0400 Subject: [PATCH 2/3] revised heap_sort.py --- heaps/heap_sort.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/heaps/heap_sort.py b/heaps/heap_sort.py index 2acbd4e..dffb858 100644 --- a/heaps/heap_sort.py +++ b/heaps/heap_sort.py @@ -1,6 +1,5 @@ from heaps.min_heap import MinHeap - def heap_sort(list): """ This method uses a heap to sort an array. Time Complexity: O(n log n) @@ -8,10 +7,10 @@ def heap_sort(list): """ heap = MinHeap() for value in list: - heap.add(list) + heap.add(value) index = 0 while not heap.empty(): - value[index] = heap.remove() + # value[index] = heap.remove() index += 1 - return value + return list \ No newline at end of file From 30dbfada66f8ae3231298d2af0b746d1174f54ee Mon Sep 17 00:00:00 2001 From: rpeeples Date: Thu, 29 Sep 2022 15:57:00 -0400 Subject: [PATCH 3/3] passing more tests --- heaps/heap_sort.py | 22 ++++++++++++---------- heaps/min_heap.py | 24 ++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/heaps/heap_sort.py b/heaps/heap_sort.py index dffb858..2296ebb 100644 --- a/heaps/heap_sort.py +++ b/heaps/heap_sort.py @@ -1,16 +1,18 @@ -from heaps.min_heap import MinHeap +from heapq import heappush, heappop + def heap_sort(list): """ This method uses a heap to sort an array. Time Complexity: O(n log n) Space Complexity: O(1) """ - heap = MinHeap() - for value in list: - heap.add(value) - index = 0 - while not heap.empty(): - # value[index] = heap.remove() - index += 1 - return list - \ No newline at end of file + heap = [] + for element in list: + heappush(heap, element) + + sorted_elements = [] + + while len(heap) != 0: + sorted_elements.append(heappop(heap)) + + return sorted_elements \ No newline at end of file diff --git a/heaps/min_heap.py b/heaps/min_heap.py index 97a712a..b720d30 100644 --- a/heaps/min_heap.py +++ b/heaps/min_heap.py @@ -1,3 +1,6 @@ +from heapq import heappop + + class HeapNode: def __init__(self, key, value): @@ -35,8 +38,25 @@ def remove(self): Time Complexity: O(log n) Space Complexity: O(1) """ - if len(self.store) == 0: - return None + # if len(self.store) == 0: + # return None + # if value == None: + # value = key + + # node = HeapNode(key, value) + # self.store.append(node) + # self.heap_up(len(self.store) - 1) + # heap_list = list(self.store) + # for i in range(len(heap_list)): + # while heap_list[i] > heap_list[0]: + # up = (i + 1) / 2 - 1 + # heap_list[i] = heap_list[up] + # i = up + # return i + for value in self.store: + self.store[value] = next(iter(self.store[value:value+1]), "error") + while len(self.store) and self.store[0] in self.store and self.store[self.store[0]]: + heappop(self.store) def __str__(self): """ This method lets you print the heap, when you're testing your app.