Menu
Coddy logo textTech

Merge Sort

Última actualización

Merge sort es un algoritmo de divide y vencerás. Divide recursivamente el arreglo por la mitad hasta que cada pieza tiene un solo elemento (que está trivialmente ordenado), y luego fusiona las piezas de nuevo en orden. El paso de fusión recorre dos subarreglos ordenados con dos punteros, copiando siempre el elemento frontal más pequeño. Pulsa reproducir arriba para ver cómo se reconstruye el arreglo fusión a fusión.

Como siempre divide por la mitad, merge sort se ejecuta en tiempo O(n log n) en todos los casos: su peor caso es tan bueno como su mejor caso. La contrapartida es O(n) de espacio adicional para el búfer temporal de fusión.

Complejidad temporal y espacial

CasoComplejidadNotas
Mejor casoO(n log n)Siempre divide la entrada a la mitad
Caso promedioO(n log n)Orden aleatorio
Peor casoO(n log n)Garantizado - no hay entradas malas
EspacioO(n)Búfer temporal para la fusión
EstableLos empates se resuelven por la izquierda durante la fusión

Paso a paso

PasoQué ocurre
1Si el rango tiene 0 o 1 elementos, ya está ordenado.
2Divide el rango en dos mitades.
3Ordena recursivamente la mitad izquierda con merge sort.
4Ordena recursivamente la mitad derecha con merge sort.
5Fusiona las dos mitades ordenadas con dos punteros.

Ejemplo resuelto

Ordenando [5, 2, 4, 1]:

PasadaArregloAcción
Dividir[5, 2] | [4, 1]Divide el arreglo en dos mitades
Dividir[5] [2] | [4] [1]Divide de nuevo hasta que cada pieza es un solo elemento
Fusionar[2, 5] | [1, 4]Fusiona [5],[2] en [2, 5] y [4],[1] en [1, 4]
Fusionar[1, 2, 4, 5]Fusiona [2, 5] y [1, 4]: elige 1, luego 2, luego 4, luego 5
Listo[1, 2, 4, 5]El arreglo está completamente ordenado

Cuándo usar merge sort

Úsalo cuandoEvítalo cuando
Necesitas un peor caso garantizado de O(n log n)La memoria es escasa y O(n) de espacio extra es inaceptable
La estabilidad importa (las claves iguales mantienen su orden)Ordenas arreglos pequeños donde insertion sort es más rápido
Ordenas una lista enlazadaEl ordenamiento in situ es un requisito estricto
Los datos son demasiado grandes para la RAM (ordenamiento externo)La localidad de caché domina y las pasadas in situ de quicksort ganan

Código de Merge Sort

Una implementación limpia y ejecutable de Merge Sort en Python, JavaScript, Java, C++, C. Elige un lenguaje, copia el código o ábrelo ya cargado en el Playground de Coddy.

Código de Merge Sort en Python

Python
1def merge_sort(a):2    if len(a) <= 1:3        return a4    mid = len(a) // 25    left = merge_sort(a[:mid])6    right = merge_sort(a[mid:])7    return merge(left, right)8
9
10def merge(left, right):11    out = []12    i = j = 013    while i < len(left) and j < len(right):14        if left[i] <= right[j]:15            out.append(left[i])16            i += 117        else:18            out.append(right[j])19            j += 120    out.extend(left[i:])21    out.extend(right[j:])22    return out23
24
25nums = [38, 27, 43, 3, 9, 82, 10]26print("Before:", nums)27print("After: ", merge_sort(nums))
Ejecuta este código en el Playground de Python

Preguntas frecuentes sobre Merge Sort

¿Cuál es la complejidad temporal de merge sort?
Merge sort es O(n log n) en el mejor, el promedio y el peor caso, porque siempre divide el arreglo por la mitad. Usa O(n) de espacio adicional para el búfer de fusión.
¿Es merge sort estable?
Sí, cuando el paso de fusión resuelve los empates tomando primero de la mitad izquierda. Esto mantiene los elementos iguales en su orden relativo original, por lo que merge sort es una opción común para el ordenamiento estable.
¿Por qué usar merge sort en lugar de quicksort?
Merge sort garantiza O(n log n) incluso en entradas adversas y es estable, mientras que quicksort puede degradarse a O(n²). Merge sort también se prefiere para listas enlazadas y ordenamiento externo. La desventaja es su memoria adicional de O(n).
¿Cuál es la diferencia entre merge sort y quicksort?
Ambos son ordenamientos de divide y vencerás, pero quicksort particiona en torno a un pivote y ordena in situ con O(log n) de espacio de pila, mientras que merge sort divide a ciegas por la mitad y fusiona usando un búfer de O(n). Quicksort suele ser más rápido en la práctica por la localidad de caché, pero merge sort tiene un peor caso garantizado de O(n log n) y es estable.
¿Cuándo debería usar merge sort en la práctica?
Recurre a merge sort cuando necesitas un ordenamiento estable con una cota garantizada de O(n log n), al ordenar listas enlazadas (donde no necesita acceso aleatorio), o al hacer ordenamiento externo de datos demasiado grandes para caber en memoria. Evítalo cuando la memoria es escasa, ya que necesita O(n) de espacio adicional.
¿Merge sort ordena in situ?
No. El merge sort estándar reserva un búfer temporal de O(n) para fusionar las dos mitades, por lo que no es in situ. Existen variantes de fusión in situ, pero son complejas y o bien más lentas o pierden la estabilidad, así que la versión basada en búfer es la opción común.
Coddy programming languages illustration

Domina los algoritmos con Coddy

COMENZAR