2015-07-03 15 views
5

Sto cercando di implementare un algoritmo di ordinamento merge ricorsivo con funzioni solo che non restituiscono nulla, ma ho difficoltà a farlo funzionare. Sembra come se stesse abbattendo gli elenchi e li ordinasse correttamente, ma non sta trasferendo quelle liste ordinate nella prossima chiamata ricorsiva.Tipo di merge ricorsivo Python ordinamento non funzionante

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) 

risposta

2

L'indicizzazione degli elenchi crea un nuovo elenco (left = inplist[0:mid]). Dal momento che non sembra che si stiano riassegnando i nuovi elenchi (dopo l'unione) a inplist, non accadrà nulla a inplist.

Infatti, merge() fonde le due liste, ma poi butta via il risultato: si crea all'interno resultmerge(), ma non fanno nulla con esso, in modo sarà scartato dopo le uscite di funzione.

Immagino sia necessario restituire result da merge() e assegnarlo a inplist; qualcosa di simile (non testata):

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

merge_sort è una funzione ricorsiva, vorrei che correttamente riportare i valori di livello 2 o 3 di ricorsione? –

+0

@AnandSKumar Suppongo che dipenda un po 'da come lo si imposta, ma penso che dovrebbe funzionare, sì. Principalmente perché assegni di nuovo il risultato finale all'elenco originale; qualsiasi elenco intermedio può essere copie o riferimenti a (parti di) l'elenco originale, ma non importa più a quel punto. Certo, importa nel senso dell'uso della memoria; in tal caso avresti sempre bisogno di passare la lista completa, più gli indici di inizio e fine rilevanti (proprio come si farebbe in C). – Evert