2013-11-15 2 views
1

Я пытался реализовать этот псевдокод алгоритма рекурсивной сортировки слияния:Python - Merge Сортировка Рекурсивного алгоритм

**procedure** *mergesort*(L = a1, a2,…,an) 
**if** n > 1 **then** 
    m := ⌊n/2⌋ 
    L1 := a1, a2,…,am 
    L2 := am+1, am+2,…,an 
    L := merge(mergesort(L1), mergesort(L2)) 
{L is now sorted into elements in increasing order} 

**procedure** *merge*(L1, L2 :sorted lists) 
L := empty list 
**while** L1 and L2 are both nonempty 
remove smaller of first elements of L1 and L2 from its list; 
     put at the right end of L 
**if** this removal makes one list empty 
    **then** remove all elements from the other list and append them to L 
return L {L is the merged list with the elements in increasing order} 

Цель его написать это на питоне, до сих пор я закодирован все это, но это делает не запускается должным образом, каждый раз, когда я запускаю его, выполняется печать: слияние функций на 0x0000000002024730. Вот код питона:

#Recursive Merge Sort 
import math 
ent = [10000, 967, 87, 91, 117, 819, 403, 597, 1201, 12090] 
def merge(L1, L2): 

     while len(L1) and len(L2) != 0: 
      L.append(L1[0]) 
      L1.remove(L1[0]) 
      L.append(L2[0]) 
      L2.remove(L2[0]) 
      if len(L1) == 0: 
       L.append(L2) 
      elif len(L2) == 0: 
       L.append(L1) 
     return L 


def mergesort(ent): 

if len(ent)>1: 
    m=math.floor(len(ent)/2) 
    L1 = [] 
    L2 = [] 
    L1=L1+ent[:m] 
    L2=L2+ent[m+1:len(ent)] 
    L=merge(mergesort(L1),mergesort(L2)) 




print(merge) 

У меня есть некоторые сомнения о том, как функции supossed работать рекурсивно вместе, поэтому я думаю, что я не могу решить, и код правильно. Любая помощь или предложения?

+0

@alienhard дал очень хороший вариант в этом [вопросе] [1]. [1]: http://stackoverflow.com/questions/11112789/merge-sort-implementation-check – Jacky

ответ

4

Вы не выполняете merge, но распечатываете функцию себя. Сделайте это:

print(merge()) 

Однако ваша логика немного перепутались, вы даже не имеют рекурсивную функцию там.

Взгляните на эту question

Кроме того, я думаю, что вам нужно, это позвонить слиянием:

def mergesort(ent): 
    if len(ent)>1: 
     m=math.floor(len(ent)/2) 
     L1 = ent[:m] 
     L2 = ent[m+1:len(ent)] 
     L=merge(mergesort(L1),mergesort(L2)) 
return L 

И выполнить его:

print(mergesort(ent)) 
+0

я только после давая псевдокоде, мой первый раз кодирования питон :), но я попробовал то, что вы предложили, и он возвращает: Traceback (последний последний звонок): Файл «C: \ Users \ * \ Documents \ A7 \ 15.py», строка 32, в print (merge (L1, L2)) ​​ NameError: имя 'L1' не определено –

+1

Вам нужно передать значение 'merge', так как оно его ожидает. Возможно, вы хотели выполнить 'mergesort'? – aIKid

+0

Я передал значение в последней строке mergesort, не знаю, правильно ли, но я так думаю, также напечатал mergesort (ent), и компилятор начал ныть о нем, заявление merge (mergesort (L1), mergesort (L2)), Я хочу, чтобы они были объединены, чтобы перейти к функции слияния, рекурсивно. –

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