From b3f8892039270c5795250d3b6e1a235aec8fe869 Mon Sep 17 00:00:00 2001 From: Margaret Finnan Date: Thu, 19 Sep 2019 15:44:52 -0700 Subject: [PATCH 1/4] implemented min_heap --- lib/min_heap.rb | 46 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/lib/min_heap.rb b/lib/min_heap.rb index 6eaa630..e8c9e92 100644 --- a/lib/min_heap.rb +++ b/lib/min_heap.rb @@ -8,7 +8,6 @@ def initialize(key, value) end class MinHeap - def initialize @store = [] end @@ -17,7 +16,9 @@ def initialize # Time Complexity: ? # Space Complexity: ? def add(key, value = key) - raise NotImplementedError, "Method not implemented yet..." + heap_node = HeapNode.new(key, value) + @store.push(heap_node) + heap_up(@store.length - 1) end # This method removes and returns an element from the heap @@ -25,10 +26,14 @@ def add(key, value = key) # Time Complexity: ? # Space Complexity: ? def remove() - raise NotImplementedError, "Method not implemented yet..." + # raise NotImplementedError, "Method not implemented yet..." + #swap element to be removed with the last element + swap(0, @store.length - 1) + answer = @store.pop + heap_down(0) + return answer.value end - # Used for Testing def to_s return "[]" if @store.empty? @@ -39,7 +44,7 @@ def to_s end output += @store.last.value + "]" - + return output end @@ -58,14 +63,37 @@ def empty? # Time complexity: ? # Space complexity: ? def heap_up(index) - + return if index == 0 + parent_index = (index - 1) / 2 + return if @store[parent_index].key < @store[index].key + swap(index, parent_index) + heap_up(parent_index) end - # This helper method takes an index and + # 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..." + # raise NotImplementedError, "Method not implemented yet..." + left_child = index * 2 + 1 + right_child = index * 2 + 2 + if @store[left_child] == nil #at bottom of tree + return + end + if @store[right_child] == nil + if @store[index] > @store[left_child] + swap(index, left_child) + end + return + end + + if @store[left_child].key < @store[right_child].key + swap(left_child, index) + heap_down(left_child) + else + swap(right_child, index) + heap_down(right_child) + end end # If you want a swap method... you're welcome @@ -74,4 +102,4 @@ def swap(index_1, index_2) @store[index_1] = @store[index_2] @store[index_2] = temp end -end \ No newline at end of file +end From b4a767392be209dce314e5c713d3b0984b77d9cb Mon Sep 17 00:00:00 2001 From: Margaret Finnan Date: Thu, 19 Sep 2019 15:54:11 -0700 Subject: [PATCH 2/4] added time and space complexity --- lib/min_heap.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/min_heap.rb b/lib/min_heap.rb index e8c9e92..fb64612 100644 --- a/lib/min_heap.rb +++ b/lib/min_heap.rb @@ -13,8 +13,8 @@ def initialize end # This method adds a HeapNode instance to the heap - # Time Complexity: ? - # Space Complexity: ? + # Time Complexity: O(log n) + # Space Complexity: constant def add(key, value = key) heap_node = HeapNode.new(key, value) @store.push(heap_node) @@ -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(log n) + # Space Complexity: constant def remove() # raise NotImplementedError, "Method not implemented yet..." #swap element to be removed with the last element @@ -60,8 +60,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(log n) + # Space complexity: constant def heap_up(index) return if index == 0 parent_index = (index - 1) / 2 From c6973e27f34aa585ca81a7c10a8e464614acee15 Mon Sep 17 00:00:00 2001 From: Margaret Finnan Date: Sat, 21 Sep 2019 14:40:58 -0700 Subject: [PATCH 3/4] fixed but in min heap and implemented heapsort --- lib/heap_sort.rb | 23 +++++++++++++++++++---- lib/min_heap.rb | 2 +- test/heapsort_test.rb | 2 +- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/lib/heap_sort.rb b/lib/heap_sort.rb index c8a32a4..f272968 100644 --- a/lib/heap_sort.rb +++ b/lib/heap_sort.rb @@ -1,8 +1,23 @@ - +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..." -end \ No newline at end of file +def heapsort(list) + return list if list.length == 0 || list.length == 1 + + #create new instance of MinHeap + min_heap = MinHeap.new + + #add all the elements from list + list.each do |element| + min_heap.add(element, value = element) + end + + #remove and add to result + result = [] + list.length.times do + result << min_heap.remove + end + return result +end diff --git a/lib/min_heap.rb b/lib/min_heap.rb index fb64612..e5a313f 100644 --- a/lib/min_heap.rb +++ b/lib/min_heap.rb @@ -81,7 +81,7 @@ def heap_down(index) return end if @store[right_child] == nil - if @store[index] > @store[left_child] + if @store[index].value > @store[left_child].value swap(index, left_child) end return 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 7a699e34533c6994a026b314bfd2dc2cd2f4dfbb Mon Sep 17 00:00:00 2001 From: Margaret Finnan Date: Sat, 21 Sep 2019 14:48:16 -0700 Subject: [PATCH 4/4] added time and space complexity to heapsort --- lib/heap_sort.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/heap_sort.rb b/lib/heap_sort.rb index f272968..3b63a32 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(nlogn) +# Space Complexity: O(n) def heapsort(list) return list if list.length == 0 || list.length == 1