CONTENIDO DE LA LECCIÓN 18
CONTENIDO DE LA LECCIÓN 18
CONTENIDO DE LA LECCIÓN 18
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
MIGUEL Á. TOLEDO MARTÍNEZ<br />
un tamaño de arreglo dado, mientras que la búsqueda binaria necesita tratar con arreglos de tamaños<br />
diferentes conforme sigue dividiendo al arreglo original a la mitad. No solamente son estos arreglos de<br />
diferente tamaño, sino el primero y el último índices de cada mitad son diferentes. Como resultado,<br />
debemos proporcionar a busquedaBin() los límites del arreglo que está tratando en cualquier momento<br />
dado. Esto se puede hacer pasando el primero y último índices del arreglo dado a la función. Llamemos a<br />
estos índices primero y ultimo.<br />
Estamos listos para escribir la descripción de la interfaz de la función:<br />
Función busquedaBin(): Busca en un arreglo de enteros ordenado un valor<br />
determinado.<br />
Acepta: Un arreglo de enteros, un elemento de búsqueda, el primero<br />
y el último índices del arreglo en el cual se busca.<br />
Regresa: El índice del elemento, si se encuentra, o el valor -1 si el<br />
elemento no se encuentra.<br />
Esta descripción da suficiente información para escribir la interfaz de la función C++, como sigue:<br />
int busquedaBin(int A[], int elemento, int primero, int ultimo)<br />
Aquí, busquedaBin() regresará un valor entero que representa el índice del elemento que se busca. De<br />
nuevo, verá que regresará el valor -1 si el elemento no se encuentra en el arreglo. La función recibe el<br />
arreglo de enteros que se busca (A[]), el elemento que se busca (elemento), el primer índice del arreglo<br />
(primero) y el último índice del arreglo (ultimo) Observe que ningún tamaño se proporciona para el arreglo<br />
en que se busca porque la función buscará en forma recursiva en arreglos de diferentes tamaños.<br />
El siguiente problema es determinar qué valor de primero y ultimo se utilizarán para cualquier arreglo<br />
durante la búsqueda. Bueno, recuerde que se deberá dividir cualquier arreglo dado a la mitad para producir<br />
dos nuevos arreglos cada vez que se hace una llamada recursiva busquedaBin() Dado cualquier arreglo<br />
donde el primer índice es primero y el último índice es ultimo, se puede determinar el índice medio, como<br />
sigue:<br />
mitad = (primero + ultimo) / 2<br />
Con este cálculo, la primera mitad del arreglo empieza en primero y finaliza en mitad - 1, y la segunda<br />
mitad del arreglo empieza en mitad + 1 y finaliza en ultimo. Esta idea se muestra en la figura <strong>18</strong>.4.<br />
Pero, observe que ninguna mitad del arreglo contiene el elemento medio. Por me- dio de la utilización de<br />
esta técnica, las dos mitades no hacen un todo, ¿correcto? Por lo tanto, antes que se haga la división,<br />
suponga que verificamos el elemento medio para ver si es el elemento que se está buscando. La siguiente<br />
verificación realiza el trabajo.<br />
si (A[mitad] == elemento) entonces<br />
regresar mitad.<br />
Si esta verificación es verdadera antes de la división, se habrá encontrado el elemento que se está buscando<br />
y es posible terminar las llamadas recursivas. De otra manera, el elemento almacenado en A[mitad] no es el<br />
elemento que se está buscando, y esta posición del arreglo se puede ignorar durante el resto de la búsqueda.<br />
Si éste es el caso, se dividirá el arreglo y continuará el proceso recursivo. Sin embargo, se tiene que<br />
adicionar una segunda condición primitiva para el algoritmo recursivo. Aquí están las dos condiciones<br />
primitivas que se han hecho:<br />
1. El arreglo que se busca tiene sólo un elemento.<br />
2. A [mitad] == elemento.<br />
ARREGLOS, APUNTADORES Y ESTRUCTURAS – <strong>LECCIÓN</strong> <strong>18</strong> <strong>18</strong>-53