Búsqueda Binaria Iterativa

La búsqueda binaria sirve para encontrar un valor dentro de un vector ordenado.

Por ejemplo:

2   5   8   12   16   20   25   30

Queremos encontrar 20.

En una búsqueda común, podríamos recorrer:

2 → 5 → 8 → 12 → 16 → 20

Pero la búsqueda binaria hace algo más inteligente:

  • Mira el elemento del medio.
  • Decide si tiene que buscar a la izquierda o a la derecha.
  • Descarta la mitad que no sirve.
  • Repite.

Por eso es mucho más rápida para vectores grandes.


2. ¿Por qué el vector tiene que estar ordenado?

Porque necesitamos poder decidir qué mitad descartar.

Por ejemplo:

2   5   8   12   16   20   25   30

Buscamos 25.

El medio es 12.

Como:

25 > 12

sabemos que 25 no puede estar a la izquierda de 12, porque el vector está ordenado.

Entonces descartamos:

2   5   8   12

y seguimos buscando solamente:

16   20   25   30

3. ¿Qué significa «iterativa»?

Iterativa significa que utilizamos un ciclo, normalmente while.

Por ejemplo:

while (inicio<=fin){// buscar}

No utilizamos recursividad.

Entonces:

  • Búsqueda binaria iterativa → usa while.
  • Búsqueda binaria recursiva → la función se llama a sí misma.

4. ¿Cómo hacemos esto con punteros?

Acá está la parte importante.

Supongamos:

intvector[] = {2, 5, 8, 12, 16, 20, 25, 30};

Normalmente accederíamos a un elemento así:

vector[3]

Si hacemos:

vector+3

obtenemos la dirección del 12.

Y:

*(vector+3)

obtiene el valor 12.


5. Los tres punteros que vamos a usar

Para hacer la búsqueda binaria vamos a tener:

int* inicio;
int* medio;
int* fin;

Representan:

inicio → primer elemento que estamos buscando
medio → elemento del medio
fin → último elemento que estamos buscando

Inicialmente:

Después calculamos:

medio=inicio+ (fin-inicio) /2;

Quedaría aproximadamente:


6. ¿Cómo sabemos qué hacer?

Comparamos:

*medio

con el valor que buscamos.

Hay tres posibilidades.

Caso 1: encontramos el valor

if (*medio==buscado)

Entonces terminamos.


Caso 2: el valor buscado es menor

elseif (buscado<*medio)

Tenemos que buscar hacia la izquierda.

Movemos fin:

fin=medio-1;

Caso 3: el valor buscado es mayor

else

Tenemos que buscar hacia la derecha.

Movemos inicio:

inicio=medio+1;

7. Ejemplo completo

Vamos a hacer un programa que busque 20.

#include <stdio.h>

int busquedaBinaria(int *vector, int cantidad, int buscado)
{
int *inicio = vector;
int *fin = vector + cantidad - 1;

while (inicio <= fin)
{
int *medio = inicio + (fin - inicio) / 2;

if (*medio == buscado)
{
return medio - vector;
}
else if (buscado < *medio)
{
fin = medio - 1;
}
else
{
inicio = medio + 1;
}
}

return -1;
}

int main()
{
int vector[] = {2, 5, 8, 12, 16, 20, 25, 30};
int cantidad = 8;
int buscado = 20;
int posicion;

posicion = busquedaBinaria(vector, cantidad, buscado);

if (posicion != -1)
{
printf("Elemento encontrado en la posicion %d\n", posicion);
}
else
{
printf("Elemento no encontrado\n");
}

return 0;
}