¿Cómo funciona la ordenación por fusión en C ++?

¡Como en cualquier otro lenguaje de programación!
Puedes ver la demostración del algoritmo trabajando en el video

Mergesort es un algoritmo de estrategia de divide y vencerás, por lo que generalmente se implementa de forma recursiva.

En general, el caso base para el algoritmo es cuando tiene una matriz de tamaño 0 o 1. Aquí está ModifiedMergeSort, el caso base para esto es cuando le quedan k elementos, ordénelos usando el orden de inserción. Porque si tiene un número pequeño de datos (es decir, k elementos), la ordenación por inserción supera a MergeSort.

vacío ModifiedMergeSort (int A [], int p, int r, int k) {
si (r – p + 1> k) {
int q = (p + r) / 2;
ModifiedMergeSort (A, p, q, k);
ModifiedMergeSort (A, q + 1, r, k);
Fusionar (A, p, q, r);
}
más
InsertionSort (A, p, r);
}

fusión vacía (int A [], int p, int q, int r) {
int n1 = q – p + 1;
int n2 = r – q;
int * L = nuevo int [n1];
int * R = nuevo int [n2];
para (int i = 0; i <n1; ++ i)
L [i] = A [p + i];
para (int i = 0; i <n2; ++ i)
R [i] = A [q + 1 + i];
int k = p;
int i = 0;
int j = 0;
while (i <n1 && j <n2)
si (L [i] <= R [j])
A [k ++] = L [i ++];
más
A [k ++] = R [j ++];
mientras que (i <n1)
A [k ++] = L [i ++];
mientras que (j <n2)
A [k ++] = R [j ++];
eliminar [] L;
eliminar [] R;
}

InsertionSort vacío (int A [], int p, int r) {
usando std :: swap;
para (int i = p + 1; i <= r; ++ i) {
tecla int (A [i]);
int j (i – 1);
while (j> = p && tecla [j]>)
A [j– + 1] = A [j];
A [j + 1] = tecla;
}
}

Funciona exactamente de la misma manera que la combinación de clasificación funciona en cualquier otro idioma. Cualquier implementación que vea en cualquier otro lenguaje o, incluso, en pseudocódigo, se traduce casi literalmente a C ++ con poca o ninguna diferencia algorítmica.

Existen varios enfoques diferentes para fusionar algoritmos de ordenación, que difieren, por ejemplo, en si se trata de fusiones en el lugar o fuera de lugar o si es estable (los elementos iguales permanecen en el mismo orden después de la ordenación), y así sucesivamente.

Funciona simplemente dividiendo conceptualmente una matriz en dos segmentos, recurriendo hacia abajo con el mismo algoritmo de clasificación de fusión y repitiendo el proceso hasta que el segmento que se está examinando sea lo suficientemente pequeño como para ordenarlo rápidamente, luego combina los resultados de ordenar cada subsegmento.

Por ejemplo, dada una matriz de 8 elementos:

{5, 3, 8, 6, 1, 9, 2, 4}

… La función mergesort se llama a sí misma en el rango de los primeros 4 elementos, luego nuevamente en los primeros dos. Los 5 y 3 se intercambian y esa llamada vuelve. Luego vuelve a aparecer en los siguientes dos elementos, intercambia los 8 y 6 y regresa. Luego “fusiona” estos resultados, recorriendo ambos segmentos y ordenándolos. Ya están ordenados, por lo que vuelve a la primera llamada.

Luego se llama a sí mismo en la segunda mitad de la matriz, luego nuevamente en la primera mitad de ese segmento, y así sucesivamente, y luego combina esos dos segmentos. “Fusiona” los resultados, probablemente copiándolos en otra matriz para ponerlos en orden. Tendrá un índice en el 1 y el 2, 1 es más pequeño, por lo que copia eso y avanza el primer índice al 9, 2 es más pequeño, por lo que copia eso y avanza el segundo índice al 4, y se repite hasta que la matriz se vea así:

{3, 5, 6, 8, 1, 2, 4, 9}

Luego regresa y la primera llamada combina las dos mitades ordenadas. 1 es menor que 3, copia, avance. 2 es menor que 3, copia, avance. 3 es menor que 4, copia, avance. Y así.

More Interesting

Como un codificador relativamente nuevo, mi código es un poco más largo que el de un programador experimentado en resolución de problemas. ¿Será esto un elemento disuasorio para los empleadores?

¿Cuál es un ejemplo de un buen algoritmo que se puede usar para unir a diferentes usuarios dentro de un determinado radio en cualquier ubicación según sus preferencias?

¿Por qué se utilizan montones para la asignación de memoria? ¿Por qué no se utilizan pilas ni ninguna otra?

¿Existe un algoritmo borroso que replica la miopía?

¿Qué es lo más importante para las empresas de software: código abierto, proyectos extracurriculares o habilidades algorítmicas (habilidades de programación competitiva)?

¿Existe un algoritmo rápido que, dada una cuadrícula de números, encuentre todas las rutas posibles que sumen a un número dado?

Cómo determinar la eficiencia de un programa de retroceso

¿Por qué no hay soluciones a pedido de Hadoop para múltiples inquilinos?

¿Cómo manejan las personas el error de profundidad de recursión máxima excedida sin reescribir el código de forma iterativa? (en la programación dinámica de arriba hacia abajo)

¿Alguien puede ayudarme a resolver el problema SPOJ "Consulta en un árbol" (QTREE)?

¿Podemos aplicar Ford-Fulkerson a un gráfico de múltiples fuentes y sumideros múltiples?

¿El conocimiento en algoritmos y estructuras de datos le ayuda a avanzar en el campo de la programación?

¿Es un nodo raíz un nodo interno en una estructura de datos de árbol?

¿Cómo ordena Quora los elementos que aparecen en la secuencia de un usuario?

Cómo encontrar el factorial de un número grande, como 100, en C