2015-07-03 3 views
5

Я пытаюсь реализовать алгоритм сортировки рекурсивного слияния только с функциями, которые ничего не возвращают, но мне трудно заставить его работать. Кажется, что он разбивает списки и правильно сортирует их, но не переносит эти отсортированные списки в следующий рекурсивный вызов.Python Рекурсивное слияние Сортировка не работает

def merge(list1, list2): 
    result = [] 
    i = 0 
    j = 0 
    k = 0 
    while i < len(list1) and j < len(list2): 
     if list1[i] < list2[j]: 
      result.append(list1[i]) 
      i+=1 
     else: 
      result.append(list2[j]) 
      j+=1     
     k+=1 
    while i < len(list1): 
     result.append(list1[i]) 
     i+=1 
     k+=1 
    while j < len(list2): 
     result.append(list2[j]) 
     j+=1 
     k+=1 
    print(result) 


def merge_sort(inplist): 
    if int(len(inplist)) >1: 
     mid = len(inplist)//2 
     left = inplist[0:mid] 
     right = inplist[mid:] 
     merge_sort(left) 
     merge_sort(right) 
     merge(left,right) 


test = [1,4,7,2,6,9,8,5,3,0] 
merge_sort(test) 
print(test) 

ответ

2

Индексирование списков создает новый список (left = inplist[0:mid]). Поскольку вы, похоже, не переписываете эти новые списки (после слияния) с inplist, ничего не произойдет с inplist.

В самом деле, merge() объединяет два списка, а затем выбрасывает результат: вы создаете result внутри merge(), но вы ничего не делать с ним, поэтому он будет отброшен после функциональных выходов.

Думаю, вам необходимо вернуть result с merge() и назначить его inplist; что-то вроде (непроверено):

inplist[:] = merge(left, right) 
+0

merge_sort - рекурсивная функция, правильно ли она переносит значения со второго или третьего уровня рекурсии? –

+0

@AnandSKumar Я думаю, это зависит от того, как вы его настроили, но я думаю, что это должно сработать, да. В основном потому, что вы снова назначаете окончательный результат первоначальному списку; любой промежуточный список может быть копиями или ссылками на (части) исходного списка, но это не имеет значения в этот момент. Конечно, это имеет значение в смысле использования памяти; в этом случае вам всегда нужно будет пройти полный список, а также соответствующие начальные и конечные индексы (как это можно сделать на C). – Evert

Смежные вопросы