Introducción a la programación con c

Page 201

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


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.