06.05.2013 Views

CONTENIDO DE LA LECCIÓN 18

CONTENIDO DE LA LECCIÓN 18

CONTENIDO DE LA LECCIÓN 18

SHOW MORE
SHOW LESS

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

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

Saved successfully!

Ooh no, something went wrong!