Algoritmo MergeSort


MergeSort es un algoritmo de ordenamiento eficiente que utiliza la técnica de "dividir y conquistar", consiste en dividir repetidamente la lista original en mitades hasta que cada sublista tenga un solo elemento, luego fusiona esas sublistas de manera ordenada. La clave de MergeSort es la operación de fusión, donde combina dos sublistas ordenadas en una única lista ordenada.

Ventajas:

  • Eficiencia: Muy eficiente para ordenar conjuntos de datos de cualquier tamaño y desordenados.
  • Muy estable: Conserva el orden relativo de los elementos con claves iguales.
  • Bajo uso de memoria: Eficiente en términos de uso de memoria auxiliar.

Desventajas:

  • Inadaptable: No puede aprovechar la información sobre la distribución de los datos.
  • Lentitud: Lento para conjuntos de datos muy grandes.
  • Muchos intercambios: Realiza muchos intercambios de elementos.

Demostración del Algoritmo

Instrucciones:

1. Ingresar valores numéricos del 1 al 10.
2. Se necesitan por lo menos 3 valores para poder ser ordenados.
3. Presione "Aleatorio" para generar valores al azar.
4. Cada valor corresponde al tamaño de las barras en el gráfico.
5. Cuando las barras se colorean de verde significa que han sido ordenadas.
6. Presione "Ordenar" para ejecutar el algoritmo y ordenar los valores de forma ascendente.
7. Presione "Limpiar" para borrar el gráfico.


Código:

function mergeSort(arreglo){
    if(arreglo.length <= 1){
        return arreglo;
    }
    const medio = Math.floor(arreglo.length / 2);  
    const izquierda = arreglo.slice(0, medio);
    const derecha = arreglo.slice(medio);
    const izqOrdenado = mergeSort(izquierda);
    const derOrdenado = mergeSort(derecha);
        
    return merge(izqOrdenado, derOrdenado);
}
          
function merge(izquierda, derecha){
    let resultado = [];
    let izqIndex = 0;
    let derIndex = 0;
          
    while(izqIndex < izquierda.length && derIndex < derecha.length){
        if(izquierda[izqIndex] < derecha[derIndex]){
            resultado.push(izquierda[izqIndex]);
            izqIndex++;
        }else{
            resultado.push(derecha[derIndex]);
            derIndex++;
        }
    }
    while(izqIndex < izquierda.length){
        resultado.push(izquierda[izqIndex]);
            izqIndex++;
    }
    while(derIndex < derecha.length){
        resultado.push(derecha[derIndex]);
        derIndex++;
    }  
    return resultado;
}