3 Funciones
CC 2003, 2008 Andr´ es Marzal e Isabel Gracia
0
1
2
3
0
1 3 11 21
1
2
i 0
1
2
3
0
0 12 82 98
3
2
3
4
5
6
j 0
1 3 11 21
1
1
2
k
3
0
0 12 82 98 i
7
0 1 3 11 12 21 82 1
2
3
4
5
6
7
0 1 3 11 12 21 82 98 j
k
Un u ´ltimo paso del proceso de fusi´ on deber´ıa copiar los elementos de c en a y b, que en realidad son fragmentos contiguos de un mismo vector. Vamos a por los detalles de implementaci´on. No trabajamos con dos vectores independientes, sino con un s´ olo vector en el que se marcan ((subvectores)) con pares de ´ındices. 1 2 3 4
void merge(int v[], int inicio1, int final 1, int inicio2, int final 2) { int i, j, k; int c[final 2-inicio1+1]; // Vector de talla determinada en tiempo de ejecuci´ on.
5
i = inicio1; j = inicio2; k = 0;
6 7 8 9
while (i<=final 1 && j<=final 2) if (v[i] < v[j]) c[k++] = v[i++]; else c[k++] = v[j++];
10 11 12 13 14 15
while (i<=final 1) c[k++] = v[i++];
16 17 18
while (j<=final 2) c[k++] = v[j++];
19 20 21
for (k=0; k<final 2-inicio1+1; k++) v[inicio1+k] = c[k];
22 23 24
}
El u ´ltimo paso del procedimiento se encarga de copiar los elementos de c en el vector original. Ya est´a. Bueno, a´ un podemos efectuar una mejora para reducir el n´ umero de par´ametros: f´ıjate en que inicio2 siempre es igual a final 1+1. Podemos prescindir de uno de los dos par´ametros:
1 2 3 4
void merge(int v[], int inicio1, int final 1, int final 2) { int i, j, k; int c[final 2-inicio1+1];
5 6 7 8
i = inicio1; j = final 1+1 ; k = 0;
9 10 11 12 13 14
while (i<=final 1 && j<=final 2) if (v[i] < v[j]) c[k++] = v[i++]; else c[k++] = v[j++];
15 16 17
while (i<=final 1) c[k++] = v[i++];
18 19 20
while (j<=final 2) c[k++] = v[j++];
Introducci´ on a la Programaci´ on con C
195