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.