Merge lists 2 [ Python 3 ]
На вход программе подается число nn, а затем nn строк, содержащих целые числа в порядке возрастания. Из данных строк формируются списки чисел. Напишите программу, которая объединяет указанные списки в один отсортированный список с помощью функции quick_merge()
, а затем выводит его.
Формат входных данных
На вход программе подается натуральное число nn, а затем nn строк, содержащих целые числа в порядке возрастания, разделенные символом пробела.
Формат выходных данных
Программа должна вывести текст в соответствии с условием задачи.
Сортировка последовательностей чисел.
def quick_merge(list1, list2):
result = []
p1 = 0 # указатель на первый элемент списка list1
p2 = 0 # указатель на первый элемент списка list2
while p1 < len(list1) and p2 < len(list2): # пока не закончился хотя бы один список
if list1[p1] <= list2[p2]:
result.append(list1[p1])
p1 += 1
else:
result.append(list2[p2])
p2 += 1
if p1 < len(list1): # прицепление остатка
result += list1[p1:]
if p2 < len(list2):
result += list2[p2:]
return result
# Заводим новый пустой список, в котором будет окончательный результат
result_list = []
# Указываем количество списков, которые нужно отсортировать в единый список.
# Например, если задать цифру 5, то программа будет запрашивать 5 последовательностей цифр, для создания 5-ти списков.
for i in range(int(input())):
num = [int(ii) for ii in input().split()] # Вводим отсортированные списки, которые нужно завести в единый список.
result_list = quick_merge(result_list, num)
# Передаем в функцию сначала пустой список и первый введеный. Сравниваем "два списка".
# После первого сравнения результат сохраниться в пустой список result_list.
# Далее будут сортироваться сохраненный список "result_list" и новый список, введенный пользователем.
# выводим результат
print(*result_list)
Входные данные | Выходные данные | |
3 1 2 3 4 5 6 7 10 11 17 |
1 2 3 4 5 6 7 10 11 17 |
Описание функции (quick_merge)
Пусть мы имеем два уже отсортированных по возрастанию списка list1
и list2
.
Алгоритм быстрого слияния следующий:
- Создаем численные указатели
p1 = 0
иp2 = 0
на начала обоих списковlist1
иlist2
соответственно; - На каждом шаге берем меньший из двух элементов
list1[p1]
иlist2[p2]
; - Записываем его в результирующий список;
- Увеличиваем указатель на первый элемент списка (
p1
илиp2
) из которого был взят элемент на 11; - Когда один из начальных списков закончился, добавляем все оставшиеся элементы второго списка в результирующий список.