Domanda

Ho implementato quello che credo di essere un algoritmo merge sort in python. Non ho mai programmato in Python prima, quindi ho usato diverse risorse con i comandi che sembravano straniero a me, per ottenere una migliore comprensione.

Tuttavia, ho anche mai attuata merge sort, in primo luogo, quindi non sono sicuro se ho anche implementato correttamente. Qualsiasi orientamento, consigli, o correzioni sarebbe molto apprezzato.

Ecco il mio metodo di fusione:

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

    result += left[i:]
    result += right[j:]
    return result

Nel frattempo, ecco il mio metodo Mergesort:

def mergesort(list):
    if len(list) < 2:
        return list
    else:
        middle = len(list) / 2
        left = mergesort(list[:middle])
        right = mergesort(list[middle:])
        return merge(left, right)

Grazie per qualsiasi aiuto possibile! :)

È stato utile?

Soluzione

Non nominare le variabili "lista". Questo è il nome del tipo di matrice di Python, in modo da utilizzare una variabile con lo stesso nome è confuso.

Quando si torna da un condizionale, non è necessario per sitck il resto della funzione in un blocco else.

def mergesort(list):
    if len(list) < 2:
        return list
    middle = len(list) / 2
    left = mergesort(list[:middle])
    right = mergesort(list[middle:])
    return merge(left, right)

Nel complesso, sembra ragionevole.

Naturalmente, per qualsiasi cosa, ma un esercizio, si dovrebbe utilizzare list.sort o ordinato ().

a = ["abc", "de", "f", "ghijkl"]
print sorted(a, lambda a,b: cmp(len(a), len(b)))

Altri suggerimenti

Come sull'utilizzo della funzione sorted()? In questo modo:

def len_cmp(x, y):
    return len(x) - len(y)

my_strings = ["hello", "foo", "bar", "spam"]
print sorted(my_strings, len_cmp)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top