diff --git a/heaps/heap_sort.py b/heaps/heap_sort.py index 3b834a5..918bf08 100644 --- a/heaps/heap_sort.py +++ b/heaps/heap_sort.py @@ -1,8 +1,16 @@ - +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 item in list: + heap = heap.add(item) + + for i in range(len(list)): + list[i] = heap.remove() + + return list \ No newline at end of file diff --git a/heaps/min_heap.py b/heaps/min_heap.py index f6fe4e0..16d8cc3 100644 --- a/heaps/min_heap.py +++ b/heaps/min_heap.py @@ -1,5 +1,4 @@ class HeapNode: - def __init__(self, key, value): self.key = key self.value = value @@ -11,29 +10,35 @@ def __repr__(self): return str(self.value) class MinHeap: - def __init__(self): self.store = [] - 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) """ - pass + value = key if value == None else value + new_node = HeapNode(key, value) + self.store.append(new_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 self.empty(): + return None + self.swap(0, len(self.store) - 1) + removed = self.store.pop() + + self.heap_down(0) + return removed.value - def __str__(self): """ This method lets you print the heap, when you're testing your app. """ @@ -41,13 +46,12 @@ def __str__(self): return "[]" return f"[{', '.join([str(element) for element in self.store])}]" - 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 len(self.store) == 0 def heap_up(self, index): @@ -57,10 +61,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,7 +79,21 @@ 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): + return + elif right_child >= len(self.store): + smaller_child_index = left_child + else: + smaller_child_index = left_child if self.store[left_child].key < self.store[right_child].key else right_child + + if self.store[index].key < self.store[smaller_child_index].key: + return + self.swap(index, smaller_child_index) + + return self.heap_down(smaller_child_index) def swap(self, index_1, index_2):