2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Рекурсивная сортировка слиянием
Сообщение05.01.2022, 19:58 


30/03/20
367
Добрый вечер. Решая задачу реализации сортировки слиянием рекурсией зашёл в тупик, вот мой код на Python:
код: [ скачать ] [ спрятать ]
Используется синтаксис Python
def merge_two_list(a, b):
    new = []
    ai, bi = 0, 0
    while ai < len(a) and bi < len(b):
        aa, bb = a[ai], b[bi]
        if aa <= bb:
            ai += 1
            new.append(aa)
        else:
            bi += 1
            new.append(bb)
    new.extend(a[ai:])
    new.extend(b[bi:])
    return new


def merge_sort(s):
    if len(s) == 2:
        return merge_two_list(s[:1], s[1:])
    return merge_sort(s[:len(s) // 2]) + merge_sort(s[len(s) // 2:])


x = list(map(int, input().split()))
print(*merge_sort(x))

 


В функции merge_two_list реализовано слияние двух заранее отсортированных списков и с ней, как я полагаю, проблем нет. А вот с функцией merge_sort есть, на данный момент она позволяет частично отсортировать список длина которого равна 2, 4, 8, ... , 1024, ... и частично это очень частично, а именно поменять местами соседние элементы, если чётный по счёту элемент меньше предыдущего нечётного. Например, было/стало:
9 8 7 6 5 4 3 1
8 9 6 7 4 5 1 3

И на этом всё. Я никак не могу придумать, как начать снизу? Как дойдя до заведомо упорядоченных массивов длиной один, начать передавать в функцию merge_two_list уже результаты ранее отработавших вызовов этой функции? Так чтобы merge_two_list начала работать уже с отсортированными массивами не единичной длины? Условие
Код:
if len(s) == 2:
годится для старта, но никак не для продолжения, а как исправить это, придумать не выходит

Вообще рекурсия какая то очень тяжкая для меня тема, в уже прошлом году я как раз на рекурсии дизмораль словил и месяца на два забросил программирование, только в тот раз то была программа для решения судоку

 Профиль  
                  
 
 Re: Рекурсивная сортировка слиянием
Сообщение05.01.2022, 20:08 
Заслуженный участник


04/05/09
4582
Что ваш код сделает, если список пустой?
А если он содержит один элемент?

 Профиль  
                  
 
 Re: Рекурсивная сортировка слиянием
Сообщение05.01.2022, 20:11 


30/03/20
367
venco
Будет достигнута максимальная глубина рекурсивных вызовов, тоже самое и для любой длины не являющейся степенью двойки. Мне пока хотя бы в максимально комфортных условиях программу заставить работать

 Профиль  
                  
 
 Re: Рекурсивная сортировка слиянием
Сообщение05.01.2022, 20:55 
Заслуженный участник
Аватара пользователя


16/07/14
8458
Цюрих
Идея сортировки слиянием - мы можем отсортировать левую и правую половины массива, а потом "слить" две отсортированные половины в отсортированный уже весь массив. Вот только точно ли этим слиянием должна быть просто конкатенация?)

А в качестве базового случая тут удобно рассматривать массивы длины, не превосходящей 1 - они уже отсортированы.

 Профиль  
                  
 
 Re: Рекурсивная сортировка слиянием
Сообщение05.01.2022, 21:14 


06/09/12
890
У Хирьянова в лекции подробно разобраны рекуррентные сортировки. И теория, и реализация.
Кажется, в этой:
https://www.youtube.com/watch?v=qf82-r9hl2Y

 Профиль  
                  
 
 Re: Рекурсивная сортировка слиянием
Сообщение05.01.2022, 21:58 


30/03/20
367
mihaild
Спасибо, решил
statistonline
Спасибо, гляну позже

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group