Solución a la Tarea 5: Mezcla de números

Existen muchas formas de resolver esta tarea. Tal vez la más sencilla de estas era simplemente leer los dos vectores A y B en un solo vector C (las primeras N componentes de C serían las de A y las últimas M componentes de C serían las de B) para luego utilizar la función ordena vista en clase para producir el vector C ordenado, el cual es obviamente el mismo que se hubiera obtenido de mezclar los vectores A y B. Sin embargo, esta es una solución muy lenta. Una solución más rápida consiste en hacer directamente la mezcla. Esto se logra llenando C con la menor de las componentes de A y B sin procesar, teniendo cuidado de no procesar más allá del final de cada uno de estos dos vectores. Esto se hace en la función mezcla:

#include <stdio.h>
 
void lee(int n, int x[])
{
  int i;
 
  for (i = 0; i < n; i++)
    scanf("%d", &x[i]);
}
 
void imprime(int n, int x[])
{
  int i;
 
  for (i = 0; i < n; i++)
    printf("%d ", x[i]);
  printf("\n");
}
 
void mezcla(int n, int m, int x[], int y[], int z[])
{
  int i, j, k;
 
  for (i = j = k = 0; i < n || j < m; k++) {
    if (i == n)
      z[k] = y[j++];
    else if (j == m)
      z[k] = x[i++];
    else if (x[i] > y[j])
      z[k] = y[j++];
    else
      z[k] = x[i++];
  }
}
 
int main(void)
{
  int n, m;
  int a[1000], b[1000], c[2000];
 
  scanf("%d%d", &n, &m);
  lee(n, a);
  lee(m, b);
  mezcla(n, m, a, b, c);
  imprime(n+m, c);
  return 0;
}

Los valores de entrada y salida empleados para la evaluación fueron los siguientes:

4 3
1 5 6 9
2 7 11
1 1
2
3
1 3
2
3 4 5
1 3
3
2 4 5
1 3
5
2 3 4
1 2 5 6 7 9 11
2 3
2 3 4 5
2 3 4 5
2 3 4 5
3 1
2 3 4
1
3 1
1 2 4
3
3 1
1 2 3
4
4 4
1 2 3 4
5 6 7 8
4 4
1 3 6 7
2 4 5 8
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8

Para probar su tarea en UNIX, escriban la instrucción gcc mezclaNN.c -o mezcla para compilar su programa, y la instrucción ./mezcla para correrlo. Algunos errores comúnes fueron: (a) querer leer dos vectores con una función que sólo lee un vector, (b) querer escribir dos vectores con una función que sólo escribe un vector, (c) en lugar de mezclar los vectores sólo pegarlos uno al final del otro, (d) olvidarse de procesar algunas de las componentes de algún vector, (e) procesar componentes inexistentes de algún vector.