CONTENIDO DE LA LECCIÓN 18

CONTENIDO DE LA LECCIÓN 18 CONTENIDO DE LA LECCIÓN 18

azul2.bnct.ipn.mx
from azul2.bnct.ipn.mx More from this publisher
06.05.2013 Views

MIGUEL Á. TOLEDO MARTÍNEZ Algoritmo clasifPorInser() clasifPorInser() INICIO Establece i = segundo índice del arreglo. mientras(i primer índice del arreglo) AND (A[j] < A[j – 1])) Inicio Intercambia A[j] y A[j – 1]. Decrementa j. Fin. Incrementa i. Fin. FIN. La variable i controla el ciclo externo y j controla el ciclo interno. Observe que i empieza en el segundo índice del arreglo. ¿Por qué no en el primer índice del arreglo? Porque el primer elemento en el arreglo se clasifica siempre relativo a cualquier elemento precedente, ¿correcto? Por lo tanto, el primer paso comienza con el segundo elemento del arreglo. El primer enunciado en el ciclo externo establece a j = i. De esta manera, i y j localizan el primer elemento en la parte no clasificada del arreglo al principio de cada paso. Ahora, el ciclo interno intercambiará al elemento localizado por j, el cual es A[j], con su elemento predecesor, el cual es A[j – 1], siempre y cuando j sea mayor que el primer índice del arreglo y el elemento A[j] sea menor que el elemento A[j – 1] Una vez que se hace el intercambio, se decrementa j. Esto obliga a j a seguir siendo el elemento insertado dentro de la parte del arreglo ordenado. El intercambio continúa hasta que no hay ningún elemento que preceda al elemento A[j] que sea menor que el A[j] Una vez que se rompe el ciclo interno, el elemento A[j] se inserta en su posición correcta con relación con los elementos que le preceden. Después, se hace otro paso incrementando la variable externa para el control del ciclo i, estableciendo j a i, y ejecutando de nuevo el ciclo interno. Este proceso de ciclo anidado continúa hasta que i se incrementa más allá de la última posición del arreglo. Estudie el algoritmo anterior y compárelo con la figura 18.3 hasta que esté seguro que comprende clasifPorInser() A continuación el código en C++. CODIFICACIÓN DEL PROBLEMA Hemos desarrollado la interfaz de la función clasifPorInser() En C++, el algoritmo se codifica fácilmente como una función semejante a ésta: // Función de intercambio() void interCambio(char &x, char &y) { char temp; // Crea una variable temporal temp = x; x = y; y = temp; } // Fin de interCambio() // Función clasificación por inserción void clasifPorInser(char A[MAX]) { int i; // Variable que controla el ciclo exterior int j; // Variable que controla el ciclo interior i = 1; // Establece i al índice del segundo elemento while(i < MAX) ARREGLOS, APUNTADORES Y ESTRUCTURAS – LECCIÓN 18 18-50

MIGUEL Á. TOLEDO MARTÍNEZ { j = i; // Localiza el primer elemento del arreglo no clasificado while((j > 0) && (A[j] < A[j – 1])) { interCambio(A[j], A[j – 1]); --j; // Hace que j siga al elemento insertado } // Final del while interno ++i; // Hace que i localice el primer elemento de la parte no clasificada. } // Fin del while externo } // Fin de clasifPorInser() En este caso se pueden ver dos funciones codificadas en C++. Recuerde que el algoritmo clasifPorInser() requiere una operación de intercambio. Para llevar a cabo esta tarea se ha codificado una función llamada interCambio() Observe que esta función tiene dos parámetros de referencia que son caracteres. De esta manera, la función recibe dos caracteres que se intercambian utilizando la variable local temporal (temp) dentro de la función. Los caracteres de intercambio se envían de regreso al programa llamador por medio de los parámetros de referencia. Desde luego, el programa llamador será la función clasifPorInser() El código de clasifPorInser() debe ser directo a partir del algoritmo que se analizó. Estudie el código y compárelo con el algoritmo. Encontrará que son idénticos desde un punto de vista lógico y estructural. Debe notar cómo se llama a la función intercambio() dentro de clasifPorInser() Los elementos del arreglo A[j] y A[j – 1] se pasan a la función. Estos elementos son caracteres sencillos, ¿correcto? Por lo tanto, la función recibe dos caracteres y los intercambia. Los caracteres respectivos en el arreglo reflejan la operación de intercambio, porque intercambio() emplea parámetros de referencia. SOLUCIÓN DE PROBLEMAS EN ACCIÓN: Búsqueda en un arreglo con recursión (Búsqueda binaria) PROBLEMA En este problema desarrollaremos otro popular algoritmo de búsqueda, llamado búsqueda binaria. El algoritmo de búsqueda binaria que desarrollaremos empleará recursividad, aunque también se puede hacer utilizando iteración. Una de las principales diferencias entre búsqueda binaria y búsqueda secuencial es que la primera requiere que el arreglo se ordene antes de la búsqueda, mientras que la segunda no tiene este requerimiento. Sin embargo, si va a empezar con un arreglo ordenado, la búsqueda binaria es mucho más rápida que la secuencial, especialmente para arreglos grandes. Por ejemplo, si fuera a aplicar una búsqueda secuencia a un arreglo de 1000 enteros, el algoritmo de búsqueda secuencial hará un promedio de 500 comparaciones para encontrar el elemento deseado. Peor aún, si el elemento deseado está en la última posición del arreglo, la búsqueda secuencial hará mil comparaciones para encontrar el elemento. Por otra parte, la búsqueda binaria requerirá un máximo de 10 comparaciones para encontrar el elemento, ¡aún si está en la última posición del arreglo! Desde luego, se debe pagar un precio por esta mayor eficiencia. El precio que se paga es un algoritmo más complejo. Por lo tanto, cuando busque en un arreglo ordenado, la ventaja de la búsqueda secuencial es simplicidad, mientras que la ventaja de la búsqueda binaria es eficiencia. Desarrolle una función en C++ que se pueda llamar para buscar en un arreglo ordenado de enteros un elemento con determinado valor y que regrese el índice del elemento si se encuentra en el arreglo. Utilice una búsqueda binaria recursiva para realizar esta tarea. Se desarrollará una función en C++, así la definición del problema se enfocará de nuevo a la interfaz de la función. Sin embargo, antes de considerar la interfaz de la función, veamos cómo funciona una búsqueda binaria recursiva, porque el algoritmo de búsqueda dictará los parámetros de la función. Por lo tanto, primero trataremos el algoritmo y después desarrollaremos la interfaz de la función. ARREGLOS, APUNTADORES Y ESTRUCTURAS – LECCIÓN 18 18-51

MIGUEL Á. TOLEDO MARTÍNEZ<br />

Algoritmo clasifPorInser()<br />

clasifPorInser()<br />

INICIO<br />

Establece i = segundo índice del arreglo.<br />

mientras(i primer índice del arreglo) AND (A[j] < A[j – 1]))<br />

Inicio<br />

Intercambia A[j] y A[j – 1].<br />

Decrementa j.<br />

Fin.<br />

Incrementa i.<br />

Fin.<br />

FIN.<br />

La variable i controla el ciclo externo y j controla el ciclo interno. Observe que i empieza en el segundo<br />

índice del arreglo. ¿Por qué no en el primer índice del arreglo? Porque el primer elemento en el arreglo<br />

se clasifica siempre relativo a cualquier elemento precedente, ¿correcto? Por lo tanto, el primer paso<br />

comienza con el segundo elemento del arreglo. El primer enunciado en el ciclo externo establece a j = i. De<br />

esta manera, i y j localizan el primer elemento en la parte no clasificada del arreglo al principio de cada<br />

paso. Ahora, el ciclo interno intercambiará al elemento localizado por j, el cual es A[j], con su elemento<br />

predecesor, el cual es A[j – 1], siempre y cuando j sea mayor que el primer índice del arreglo y el elemento<br />

A[j] sea menor que el elemento A[j – 1] Una vez que se hace el intercambio, se decrementa j. Esto obliga a<br />

j a seguir siendo el elemento insertado dentro de la parte del arreglo ordenado. El intercambio continúa<br />

hasta que no hay ningún elemento que preceda al elemento A[j] que sea menor que el A[j]<br />

Una vez que se rompe el ciclo interno, el elemento A[j] se inserta en su posición correcta con relación con<br />

los elementos que le preceden. Después, se hace otro paso incrementando la variable externa para el control<br />

del ciclo i, estableciendo j a i, y ejecutando de nuevo el ciclo interno. Este proceso de ciclo anidado<br />

continúa hasta que i se incrementa más allá de la última posición del arreglo.<br />

Estudie el algoritmo anterior y compárelo con la figura <strong>18</strong>.3 hasta que esté seguro que comprende<br />

clasifPorInser() A continuación el código en C++.<br />

CODIFICACIÓN <strong>DE</strong>L PROBLEMA<br />

Hemos desarrollado la interfaz de la función clasifPorInser() En C++, el algoritmo se codifica fácilmente<br />

como una función semejante a ésta:<br />

// Función de intercambio()<br />

void interCambio(char &x, char &y)<br />

{<br />

char temp; // Crea una variable temporal<br />

temp = x;<br />

x = y;<br />

y = temp;<br />

} // Fin de interCambio()<br />

// Función clasificación por inserción<br />

void clasifPorInser(char A[MAX])<br />

{<br />

int i; // Variable que controla el ciclo exterior<br />

int j; // Variable que controla el ciclo interior<br />

i = 1; // Establece i al índice del segundo elemento<br />

while(i < MAX)<br />

ARREGLOS, APUNTADORES Y ESTRUCTURAS – <strong>LECCIÓN</strong> <strong>18</strong> <strong>18</strong>-50

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!