CONTENIDO DE LA LECCIÓN 18
CONTENIDO DE LA LECCIÓN 18 CONTENIDO DE LA LECCIÓN 18
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
- Page 1 and 2: MIGUEL Á. TOLEDO MARTÍNEZ CONTENI
- Page 3 and 4: MIGUEL Á. TOLEDO MARTÍNEZ LECCIÓ
- Page 5 and 6: MIGUEL Á. TOLEDO MARTÍNEZ ELEMENT
- Page 7 and 8: MIGUEL Á. TOLEDO MARTÍNEZ Con las
- Page 9 and 10: MIGUEL Á. TOLEDO MARTÍNEZ del arr
- Page 11 and 12: MIGUEL Á. TOLEDO MARTÍNEZ // MUES
- Page 13 and 14: MIGUEL Á. TOLEDO MARTÍNEZ que exp
- Page 15 and 16: MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo
- Page 17 and 18: MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo
- Page 19 and 20: MIGUEL Á. TOLEDO MARTÍNEZ void ma
- Page 21 and 22: MIGUEL Á. TOLEDO MARTÍNEZ PASO DE
- Page 23 and 24: MIGUEL Á. TOLEDO MARTÍNEZ void pa
- Page 25 and 26: MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo
- Page 27 and 28: MIGUEL Á. TOLEDO MARTÍNEZ int bus
- Page 29 and 30: MIGUEL Á. TOLEDO MARTÍNEZ El cuer
- Page 31 and 32: MIGUEL Á. TOLEDO MARTÍNEZ /******
- Page 33 and 34: MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo
- Page 35 and 36: MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo
- Page 37 and 38: MIGUEL Á. TOLEDO MARTÍNEZ /* El s
- Page 39 and 40: MIGUEL Á. TOLEDO MARTÍNEZ escribi
- Page 41 and 42: MIGUEL Á. TOLEDO MARTÍNEZ /* El s
- Page 43 and 44: MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo
- Page 45 and 46: MIGUEL Á. TOLEDO MARTÍNEZ SOLUCI
- Page 47 and 48: MIGUEL Á. TOLEDO MARTÍNEZ // Busc
- Page 49: MIGUEL Á. TOLEDO MARTÍNEZ Paso 1
- Page 53 and 54: MIGUEL Á. TOLEDO MARTÍNEZ un tama
- Page 55 and 56: MIGUEL Á. TOLEDO MARTÍNEZ necesit
- Page 57 and 58: MIGUEL Á. TOLEDO MARTÍNEZ { for (
- Page 59 and 60: MIGUEL Á. TOLEDO MARTÍNEZ // Comp
- Page 61 and 62: MIGUEL Á. TOLEDO MARTÍNEZ INICIAC
- Page 63 and 64: MIGUEL Á. TOLEDO MARTÍNEZ Esta ve
- Page 65 and 66: MIGUEL Á. TOLEDO MARTÍNEZ • Los
- Page 67 and 68: MIGUEL Á. TOLEDO MARTÍNEZ Es posi
- Page 69 and 70: MIGUEL Á. TOLEDO MARTÍNEZ p[100];
- Page 71 and 72: MIGUEL Á. TOLEDO MARTÍNEZ a) Cree
- Page 73 and 74: MIGUEL Á. TOLEDO MARTÍNEZ d) ¿cu
- Page 75 and 76: MIGUEL Á. TOLEDO MARTÍNEZ medio d
- Page 77 and 78: MIGUEL Á. TOLEDO MARTÍNEZ EXAMEN
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