Это алгоритм объединения произвольного количества отсортированных списков за более или менее линейное время:
def merge_sorted(*lists)
# the lists will be modified, so make (shallow) copies
lists = lists.map(&:dup)
result = []
loop do
# ignore lists that have been exhausted
lists = lists.reject(&:empty?)
# we're done if all lists have been exhausted
break if lists.empty?
# find the list with the smallest first element
top = lists.inject do |candidate, other|
candidate.first < other.first ? candidate : other
end
result << top.shift
end
result
end
list1 = [1, 2, 5, 6, 9]
list2 = [2, 3, 4, 11, 13]
list3 = [1, 2, 2, 2, 3]
p merge_sorted(list1, list2, list3)
# => [1, 1, 2, 2, 2, 2, 2, 3, 3, 4, 5, 6, 9, 11, 13]
Для каждой итерации он находит список с наименьшим первым элементом и удаляет этот элемент изэто на список результатов.Это происходит до тех пор, пока все списки не станут пустыми.
Я говорю более или менее линейное время, так как на самом деле это O (n × m), где n - количество списков, а m - общее числоэлементов в списках, но я думаю, что это можно смело упростить до O (m) для большинства случаев, так как n будет небольшим по сравнению с m.