Búsqueda binaria
Encuentra un valor en un arreglo ordenado partiendo el rango a la mitad.
- Nivel
- Intermedio
- Conceptos:
- Entrada y salida
- Arreglos
- Mientras
- Si
- Azar
- SubProcesos
Ejecuta, modifica y depura este ejemplo en el navegador.
Lo que aprenderás
Como la lista está ordenada, al mirar el elemento del medio sabes en qué mitad puede estar el buscado y descartas la otra. Cada paso divide el rango a la mitad, así que con 512 elementos alcanzan 10 comparaciones: O(log n), contra O(n) de revisar uno por uno.
Código
// Muestra el arreglo completo solo si es corto (30 o menos)SubProceso MostrarDatos(titulo, datos, n) Definir i Como Entero Si n <= 30 Entonces Escribir Sin Saltar titulo Para i <- 1 Hasta n Hacer Escribir Sin Saltar datos[i], " " FinPara Escribir "" SiNo Escribir titulo, n, " números (el primero es ", datos[1], " y el último ", datos[n], ")" FinSiFinSubProcesoAlgoritmo BusquedaBinaria Definir datos, n, i, buscado, izquierda, derecha, medio, posicion, pasos Como Entero Escribir "¿Cuántos números tiene la lista? (1 a 512)" Leer n // La búsqueda binaria necesita datos ordenados: usamos los pares 2, 4, 6... Dimension datos[n] Para i <- 1 Hasta n Hacer datos[i] <- 2 * i FinPara MostrarDatos("Lista: ", datos, n) // Un número al azar entre 1 y 2n: si es impar, no estará en la lista buscado <- Aleatorio(1, 2 * n) Escribir "Buscando el ", buscado izquierda <- 1 derecha <- n posicion <- 0 pasos <- 0 Mientras izquierda <= derecha Y posicion = 0 Hacer medio <- Trunc((izquierda + derecha) / 2) pasos <- pasos + 1 Escribir " Paso ", pasos, ": miro la posición ", medio, " (", datos[medio], ")" Si datos[medio] = buscado Entonces posicion <- medio SiNo // Descartamos la mitad donde seguro no está Si datos[medio] < buscado Entonces izquierda <- medio + 1 SiNo derecha <- medio - 1 FinSi FinSi FinMientras Si posicion > 0 Entonces Escribir "Encontrado: el ", buscado, " está en la posición ", posicion, "." SiNo Escribir "El ", buscado, " no está en la lista." FinSi Escribir "Comparaciones: ", pasos, " de ", n, " elementos."FinAlgoritmoDiagrama de flujo
Cada bloque del diagrama corresponde a una instrucción del código.
Ejemplo de ejecución
Esto muestra el programa al ejecutarlo. Las respuestas escritas por el usuario aparecen resaltadas.
¿Cuántos números tiene la lista? (1 a 512)Respuesta del usuario: 20Lista: 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 Buscando el 27 Paso 1: miro la posición 10 (20) Paso 2: miro la posición 15 (30) Paso 3: miro la posición 12 (24) Paso 4: miro la posición 13 (26) Paso 5: miro la posición 14 (28)El 27 no está en la lista.Comparaciones: 5 de 20 elementos.
Complejidad
Cuánto trabajo y memoria necesita según la cantidad de datos (n).
| Caso | Costo |
|---|---|
| Mejor | O(1) |
| Promedio | O(log n) |
| Peor | O(log n) |
| Memoria | O(1) |
Desafío
Busca también un número que seguro no está, como 2 * n + 1, y cuenta sus pasos.
Ver pista
Puedes copiar el bloque de búsqueda o, mejor, convertirlo en una Funcion que devuelva la posición.
Ejemplos relacionados
Ordenamiento burbuja
Ordena números al azar intercambiando vecinos, y se detiene apenas quedan ordenados.
IntermedioOrdenamiento por inserción
Inserta cada número entre los ya ordenados, como al acomodar cartas en la mano.
IntermedioOrdenamiento Shell
Una inserción entre elementos lejanos, con un salto que se achica en cada pasada.
Avanzado