Taller Merge - emilioone05/Analisis_Algoritmos_utpl GitHub Wiki

Resolución del taller

public class MergeAlgorithm {

    public static void merge(int[] A, int p, int q, int r) {
        // Tamaños de los subarreglos izquierdo y derecho
        int nL = q - p + 1; // Longitud de A[p:q]
        int nR = r - q;      // Longitud de A[q+1:r]

        // Crear arreglos temporales L y R
        int[] L = new int[nL];
        int[] R = new int[nR];

        // Copiar datos a L[] y R[]
        for (int i = 0; i < nL; i++) {
            L[i] = A[p + i];
        }
        for (int j = 0; j < nR; j++) {
            R[j] = A[q + 1 + j];
        }

        // Índices para recorrer L, R y el arreglo principal A
        int i = 0, j = 0, k = p;

        // Fusionar L y R en A[p:r]
        while (i < nL && j < nR) {
            if (L[i] <= R[j]) {
                A[k] = L[i];
                i++;
            } else {
                A[k] = R[j];
                j++;
            }
            k++;
        }

        // Copiar elementos restantes de L[] (si los hay)
        while (i < nL) {
            A[k] = L[i];
            i++;
            k++;
        }

        // Copiar elementos restantes de R[] (si los hay)
        while (j < nR) {
            A[k] = R[j];
            j++;
            k++;
        }
    }

    public static void main(String[] args) {
        // Ejemplo de uso
        int[] arr = {12, 11, 13, 5, 6, 7};
        int p = 0;                  // Índice inicial
        int r = arr.length - 1;     // Índice final
        int q = (p + r) / 2;        // Punto medio

        System.out.println("Arreglo original:");
        for (int num : arr) {
            System.out.print(num + " ");
        }

        // Llamar a merge
        merge(arr, p, q, r);

        System.out.println("\nArreglo después de MERGE:");
        for (int num : arr) {
            System.out.print(num + " ");
        }
    }
}

Resolución del taller