diff --git a/heaps/heap_sort.py b/heaps/heap_sort.py index 3b834a5..c675140 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(n) """ - pass \ No newline at end of file + min_heap = MinHeap() + + + for element in list: + min_heap.add(element) + + for i in range(len(list)): + list[i] = min_heap.remove() + + return list \ No newline at end of file diff --git a/heaps/min_heap.py b/heaps/min_heap.py index f6fe4e0..d513968 100644 --- a/heaps/min_heap.py +++ b/heaps/min_heap.py @@ -19,10 +19,14 @@ 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(log n) """ - pass + if value == None: + value = key + + self.store.append(HeapNode(key,value)) + self.heap_up(len(self.store)-1) def remove(self): """ This method removes and returns an element from the heap @@ -30,7 +34,15 @@ 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) + + # return str(min_node) + return min_node.value @@ -44,10 +56,11 @@ 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 self.size() == 0 + return len(self.store) == 0 def heap_up(self, index): @@ -57,10 +70,15 @@ 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 + parent_node = (index-1) // 2 + + if index: + if self.store[index].key < self.store[parent_node].key: + self.swap(index, parent_node) + self.heap_up(parent_node) def heap_down(self, index): """ This helper method takes an index and @@ -68,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: + if right_child >= len(self.store) or 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):