From 27be08707f47d26efaadbaf6276eb8b5f9dee817 Mon Sep 17 00:00:00 2001 From: OlgaSe Date: Tue, 4 May 2021 22:08:27 -0700 Subject: [PATCH 1/4] Added heap_up, heap_down functions --- lib/min_heap.rb | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/lib/min_heap.rb b/lib/min_heap.rb index 6eaa630..4ec23f0 100644 --- a/lib/min_heap.rb +++ b/lib/min_heap.rb @@ -17,7 +17,8 @@ def initialize # Time Complexity: ? # Space Complexity: ? def add(key, value = key) - raise NotImplementedError, "Method not implemented yet..." + @store << HeapNode.new(key, value) + heap_up(@store.length - 1) end # This method removes and returns an element from the heap @@ -25,7 +26,10 @@ def add(key, value = key) # Time Complexity: ? # Space Complexity: ? def remove() - raise NotImplementedError, "Method not implemented yet..." + swap(0, @store.length - 1) + removed_element = @store.pop + heap_down(0) + return removed_element.value end @@ -47,7 +51,7 @@ def to_s # Time complexity: ? # Space complexity: ? def empty? - raise NotImplementedError, "Method not implemented yet..." + return @store.length == 0 end private @@ -58,14 +62,32 @@ def empty? # Time complexity: ? # Space complexity: ? def heap_up(index) - + return if index == 0 + parent_index = (index - 1) / 2 + if @store[index].key < @store[parent_index].key + swap(index, parent_index) + heap_up(parent_index) + end end # This helper method takes an index and # moves it up the heap if it's smaller # than it's parent node. def heap_down(index) - raise NotImplementedError, "Method not implemented yet..." + left_child = (index * 2) + 1 + right_child = (index * 2) + 2 + + return if @store[left_child].nil? || @store[right_child].nil? + + if @store[index].key > @store[left_child].key + swap(index, left_child) + heap_down(left_child) + end + + if @store[index].key > @store[right_child].key + swap(index, right_child) + heap_down(right_child) + end end # If you want a swap method... you're welcome From 11a90d3894bf202a34529344de961c384ad1dade Mon Sep 17 00:00:00 2001 From: OlgaSe Date: Tue, 4 May 2021 22:28:11 -0700 Subject: [PATCH 2/4] added heap sort method --- lib/heap_sort.rb | 16 +++++++++++++--- test/heapsort_test.rb | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/heap_sort.rb b/lib/heap_sort.rb index c8a32a4..f842949 100644 --- a/lib/heap_sort.rb +++ b/lib/heap_sort.rb @@ -1,8 +1,18 @@ - +require_relative "min_heap" # This method uses a heap to sort an array. # Time Complexity: ? # Space Complexity: ? -def heap_sort(list) - raise NotImplementedError, "Method not implemented yet..." +def heapsort(list) + result = [] + heap = MinHeap.new + list.each do |element| + heap.add(element) + end + + until heap.empty? + result << heap.remove + end + + return result end \ No newline at end of file diff --git a/test/heapsort_test.rb b/test/heapsort_test.rb index 34402ac..7ce79b7 100644 --- a/test/heapsort_test.rb +++ b/test/heapsort_test.rb @@ -1,6 +1,6 @@ require_relative "test_helper" -xdescribe "heapsort" do +describe "heapsort" do it "sorts an empty array" do # Arrange list = [] From 22c4bf9e88e55f3c99db372daee1b270bf5cc1ee Mon Sep 17 00:00:00 2001 From: OlgaSe Date: Wed, 5 May 2021 21:14:41 -0700 Subject: [PATCH 3/4] added time and space complexity --- lib/heap_sort.rb | 4 ++-- lib/min_heap.rb | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/heap_sort.rb b/lib/heap_sort.rb index f842949..80728bc 100644 --- a/lib/heap_sort.rb +++ b/lib/heap_sort.rb @@ -1,8 +1,8 @@ require_relative "min_heap" # This method uses a heap to sort an array. -# Time Complexity: ? -# Space Complexity: ? +# Time Complexity: O(n log n) +# Space Complexity: O(n) def heapsort(list) result = [] heap = MinHeap.new diff --git a/lib/min_heap.rb b/lib/min_heap.rb index 4ec23f0..ab416d9 100644 --- a/lib/min_heap.rb +++ b/lib/min_heap.rb @@ -14,8 +14,8 @@ def initialize end # This method adds a HeapNode instance to the heap - # Time Complexity: ? - # Space Complexity: ? + # Time Complexity: O(n log n) + # Space Complexity: O(1) def add(key, value = key) @store << HeapNode.new(key, value) heap_up(@store.length - 1) @@ -23,8 +23,8 @@ def add(key, value = key) # This method removes and returns an element from the heap # maintaining the heap structure - # Time Complexity: ? - # Space Complexity: ? + # Time Complexity: O(n log n) + # Space Complexity: O(1) def remove() swap(0, @store.length - 1) removed_element = @store.pop @@ -48,8 +48,8 @@ def to_s end # This method returns true if the heap is empty - # Time complexity: ? - # Space complexity: ? + # Time complexity: O(1) + # Space complexity: O(1) def empty? return @store.length == 0 end @@ -59,8 +59,8 @@ def empty? # This helper method takes an index and # moves it up the heap, if it is less than it's parent node. # It could be **very** helpful for the add method. - # Time complexity: ? - # Space complexity: ? + # Time complexity: O(n log n) + # Space complexity: O(1) def heap_up(index) return if index == 0 parent_index = (index - 1) / 2 From d940a92c23a4d99eca042ece5f32b57a14033cb0 Mon Sep 17 00:00:00 2001 From: OlgaSe Date: Wed, 5 May 2021 21:28:42 -0700 Subject: [PATCH 4/4] corrected time and space complexity --- lib/min_heap.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/min_heap.rb b/lib/min_heap.rb index ab416d9..41afab7 100644 --- a/lib/min_heap.rb +++ b/lib/min_heap.rb @@ -14,8 +14,8 @@ def initialize end # This method adds a HeapNode instance to the heap - # Time Complexity: O(n log n) - # Space Complexity: O(1) + # Time Complexity: O(log n) + # Space Complexity: O(n) def add(key, value = key) @store << HeapNode.new(key, value) heap_up(@store.length - 1) @@ -23,7 +23,7 @@ def add(key, value = key) # This method removes and returns an element from the heap # maintaining the heap structure - # Time Complexity: O(n log n) + # Time Complexity: O(log n) # Space Complexity: O(1) def remove() swap(0, @store.length - 1) @@ -59,7 +59,7 @@ def empty? # This helper method takes an index and # moves it up the heap, if it is less than it's parent node. # It could be **very** helpful for the add method. - # Time complexity: O(n log n) + # Time complexity: O(log n) # Space complexity: O(1) def heap_up(index) return if index == 0