¿Qué hay de malo en mi implementación de tipo de fusión?

Tu fusión carece un poco: lo estás haciendo “while (ind1 <size1 && ind2 <size2)". Funciona siempre y cuando ambas matrices tengan algunos datos restantes, pero cuando digamos, ind1 alcanza tamaño1, entonces está terminando la fusión, mientras que la otra matriz puede tener una gran cantidad de ella aún no procesada. Las opciones que tienes son:

  • puede agregar otro ciclo después de este para reescribir todo lo que quedó en la matriz final
  • puede hacer que la instrucción if incluya los casos límite: array [..] = array1 [..] debe hacerse si, como escribió, array1 [..] <array2 [..] – o si el índice de array2 es igual a su tamaño, y en primer lugar, a menos que el índice de array1 ya sea igual a su tamaño. ("Mientras" tiene entonces || en lugar de &&)
  • Un truco inteligente es determinar al principio (o de la descripción del problema) cuál es el mayor valor posible. Si sabe eso, agrega un valor más grande que cualquier otro (a menudo llamado “infinito”) al final de array1 y array2. De esta manera, no necesita preocuparse por nada, porque cuando se fusiona, sabe que ambas matrices se procesarán por completo antes de que su código comience a ver cualquiera de los “infinitos”.

Como nota al margen, dos consejos más al ver el código (que es bastante bueno para un principiante, aunque 🙂)

1) No te dispares en los pies creando nombres como array1 y array_1. Es posible que ahora lo tenga claro, pero cuando su código tenga varias veces más líneas, le resultará mucho más difícil leer su propio código si necesita tener conciencia del hecho si está viendo una variable array_1 o array1. Y de todos modos, el nombre matriz1 está bien, si alguien te pregunta “lo quieres” responderás “es una matriz número 1”; si alguien te pregunta qué matriz_1 es, responderás “es una matriz (…)” Bueno, en realidad no … no es una matriz, es un índice. Cuando su código tiene más de 30 líneas, es bastante confuso para cualquiera ver un nombre “matriz” si no es una matriz, ¿no? 😀 Idealmente, uno no debería necesitar profundizar en el código para saber qué es una variable solo por su nombre. Por ejemplo, ind1 e ind2 (o incluso i1 e i2 ya que los contadores de bucle generalmente se llaman i y j si el bucle es tan pequeño que no hay riesgo de olvidar qué contador es cuál), tiene array1 y array2 e indexa ind1 e ind2 no mayor que size1 y size2, es una estructura autoexplicativa para quienes lo leen.

2) No declare las matrices como array1 [10] o tendrá que cambiarlas cada vez que desee ordenar 100 elementos (y si estaba seguro de que nunca ordenará más de 10, entonces no es necesario fusionar 😉) . Por supuesto, debe elegir algún tamaño, pero si es lo suficientemente grande como para esperar que no necesite agrandarlo, verá que, por ejemplo, declararlos para cada función no es la mejor solución posible: tendrá copias de para cada nivel de la recursión, no es algo con lo que uno no pueda vivir, pero si, por ejemplo, sus datos son de 10 MB, su programa requerirá usar unos 400 MB. Pero puede usar matrices globales matriz1 y matriz2, no necesita unidades separadas para cada nivel, entonces solo necesita procesar los datos dentro de la matriz “matriz” existente: mergesort sabrá que debe ordenar la “matriz” entre algunos índices de inicio y fin, en la función de fusión copia datos de ese intervalo a array1 y array2 (como lo hace actualmente en mergesort) y durante la fusión está escribiendo los datos en el intervalo de inicio-fin de la matriz original. Por cierto, si tiene este “10” o cualquier otro número para el tamaño de la matriz, es más fácil no codificarlo todo el tiempo; de esta manera, cuando debe cambiarse, debe encontrar todos los lugares del programa cuando se usa y cambiar el valor, y su programa no funcionará si pierde alguno de ellos. Hazlo de la siguiente manera:

const int MAX_SIZE = 10; // const significa que el valor no se puede cambiar
int array1 [MAX_SIZE], array2 [MAX_SIZE]; // para que el compilador sepa qué tamaño de matrices desea, aunque solo array1 [some_variable] no funcionaría

More Interesting

¿Cuántos rectángulos de 3 × 5 caben en un rectángulo de 18 x 26? ¿Hay una manera simple de calcular?

¿Qué es el algoritmo de Wagner y Fischer y cuál es su código de muestra en C ++?

¿Cuáles son algunos de los buenos libros sobre Algoritmos de aprendizaje automático de árbol de decisión?

Hay libros que enseñan estructuras de datos y algoritmos a través de un lenguaje de programación y otros simplemente enseñan la teoría; cual me recomiendan

¿Qué temas de geometría y álgebra son importantes para concursos de programación como ICPC?

¿En qué se diferencia la programación dinámica del seguimiento hacia atrás?

¿Cuándo debo comenzar a aprender algoritmos de C ++?

Si recientemente completé un campo de entrenamiento y todo lo que queda para conseguir un trabajo es la prueba técnica, ¿cuántas horas serán suficientes los algoritmos de aprendizaje?

¿Qué es el algoritmo de captura de pantalla de Snapchat?

¿Puedo diseñar una estructura de datos tipo pila que haga popMin () en tiempo O (1)?

¿Cuáles son algunas habilidades de programación, algoritmos o marcos que se ven muy bien pero que son muy simples?

Si sabemos cómo funciona un algoritmo de hash de contraseña en particular, ¿por qué no podemos simplemente crear una contraseña que genere el mismo hash?

Cómo calcular la suma de dígitos de cada número entre 1 y n

¿Existe un método o algoritmo matemático para expresar la suma de un número y un número multiplicado por un radical como la fórmula (a + b) ^ 3?

¿Cuáles son las ventajas y desventajas de los enfoques de espera ocupada y sueño y vigilia para la exclusión mutua con respecto al kernel de Linux?