¿Cuál es la diferencia entre el orden de fusión de arriba hacia abajo y el de fusión de abajo hacia arriba?

Cualquier ejecución de MergeSort se puede visualizar como un árbol. Las hojas del árbol son los elementos individuales de la matriz. Cada nodo interno del árbol corresponde a la fusión de dos matrices más pequeñas en una matriz más grande.

Árbol de muestra MergeSort:

abcdefgh
/ \
adgh bcef
/ \ / \
gh ad bf ce
/ \ / \ / \ / \
hgdabfce

La implementación de arriba hacia abajo es la implementación que utiliza la recursividad. Comienza en la parte superior del árbol y continúa hacia abajo , cada vez que hace la misma pregunta (¿qué debo hacer para ordenar esta matriz?) Y la responde (divídala en dos, haga llamadas recursivas, combine resultados), hasta que llegar al pie del árbol.

La implementación ascendente no utiliza la recursividad. Comienza directamente en la parte inferior del árbol y continúa hacia arriba iterando sobre las piezas y fusionándolas.

A continuación se muestra una implementación de muestra de una posible versión ascendente. Tenemos una cola Q. Al principio, Q contiene secuencias de un elemento [matemáticas] n [/ matemáticas]. Durante la ordenación, repetidamente tomamos las dos secuencias más cortas, las fusionamos e insertamos la nueva secuencia en la cola.

de colecciones importación deque

def fusionar (X, Y):
X, Y, Z = deque (X), deque (Y), []
mientras que len (X)> 0 y len (Y)> 0:
si X [0] <Y [0]: Z.append (X.popleft ())
más: Z.append (Y.popleft ())
volver Z + lista (X) + lista (Y)

def bottom_up_mergesort (A):
si len (A) <= 1: lista de retorno (A)
Q = deque ([a] para a en A)
mientras cierto:
X = Q.popleft ()
si len (Q) == 0: devuelve X
Y = Q.popleft ()
# intente habilitar esta salida de depuración:
# print (‘fusión’, X, ‘y’, Y)
Q.append (fusionar (X, Y))

print (bottom_up_mergesort (‘abracadabra’))