You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

40 lines
837 B
Ruby

# Top-down Mergesort algorithm based on not optimal ruby collection methods
# just to show divide-and-conquer paradigm, uses NlgN compares to sort an array,
# see test/merge_sort_test.rb
class Merge
def initialize(array)
@array = array
end
def sort(array = @array)
return array if array.length < 2
left, right = halves(array)
merge(sort(left), sort(right))
end
private
def halves(array)
middle = array.length / 2
[array[0..(middle - 1)], array[middle..-1]]
end
def merge(first, second)
result = []
while first.any? || second.any?
if first.empty?
result << second.shift
elsif second.empty?
result << first.shift
elsif first[0] > second[0]
result << second.shift
else
result << first.shift
end
end
result
end
end