Está en la página 1de 13

Búsqueda (searching)

en arreglos
Problema de la búsqueda
 General: dado un arreglo A y un
elemento x, decidir si x está o no en
A.
 Específico: dado un arreglo de
enteros A y un entero x, hacer una
función que regrese el índice de x en
A o -1 si x no está en A.

Programación Avanzada 2
Universidad de Sonora
Ejemplo
Dado este arreglo:
int a[] = {5, 3, 20, 8, 2, 7};

System.out.println (busca (20, a));


debe escribir 2

System.out.println (busca (11, a));


debe escribir -1

Programación Avanzada 3
Universidad de Sonora
Soluciones al problema
Veremos dos soluciones clásicas:

 Búsqueda lineal.
 Búsqueda binaria.

Programación Avanzada 4
Universidad de Sonora
Búsqueda lineal
 Se busca el elemento en el arreglo de
principio a fin.
int buscaLineal (int x, int a[])
{
int index = 0;
while (index < a.length) {
if (a[index] == x)
return index;
index++;
}
return -1;
}

Programación Avanzada 5
Universidad de Sonora
Búsqueda binaria
 El arreglo debe estar ordenado de
menor a mayor o viceversa.
 Supongamos que el orden es de
menor a mayor.
 El algoritmo compara x (elemento a
buscar) con el elemento que está a la
mitad de A.

Programación Avanzada 6
Universidad de Sonora
Búsqueda binaria
 Hay 4 opciones:
 El elemento de en medio es x. Termina la
búsqueda con éxito.
 El elemento de en medio es mayor que x.
Se sigue buscando en la primera mitad de
A.
 El elemento de en medio es menor que x.
Se sigue buscando en la segunda mitad de
A.
 No existe el elemento de en medio. Termina
la búsqueda con falla.

Programación Avanzada 7
Universidad de Sonora
Búsqueda binaria
 El paso anterior se continúa hasta
obtener éxito o falla.

Programación Avanzada 8
Universidad de Sonora
Búsqueda binaria
 Ejemplo:

buscar 7 en
int a[] = {3, 7, 12, 15, 22, 34, 45, 52};

¿Cómo se encuentra el elemento de en


medio?

Programación Avanzada 9
Universidad de Sonora
Búsqueda binaria
 Se manejan dos índices. Uno apunta
al primer elemento y el otro al último.
 Para
a[] = {3, 7, 12, 15, 22, 34, 45, 52},
se define:
bajo = 0 y alto = a.length – 1 = 7
 El elemento de en medio está en:
mid = (bajo + alto) / 2 = 7 / 2 = 3
Programación Avanzada 10
Universidad de Sonora
Búsqueda binaria
 Si se está buscando el 7 en
a[] = {3, 7, 12, 15, 22, 34, 45, 52}
 Se compara 7 con a[3] (con 15).
 Como 7 es menor que 15, ya no tiene
caso buscar en la parte derecha de A.
 El problema se limita a buscar 7 en
{3, 7, 12}

Programación Avanzada 11
Universidad de Sonora
Búsqueda binaria
 En Java los arreglos no pueden
cambiar de tamaño.
 Solo se cambian los índices.
 Se sigue buscando el 7 en
a[] = {3, 7, 12, 15, 22, 34, 45, 52}
pero ahora bajo es 0 y alto es 2.

Programación Avanzada 12
Universidad de Sonora
Seudocódigo búsqueda binaria
buscaBin (x, a[]) {
bajo = 0
alto = a.length - 1
while (bajo <= alto) {
mid = (bajo + alto) / 2
if (a[mid] > x)
alto = mid - 1
else if (a[mid] < x)
bajo = mid + 1
else
return mid // éxito
}
return -1 // falla
}

Programación Avanzada 13
Universidad de Sonora

También podría gustarte