Saltar al contenido
EjemplosEnglishEspacio →

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
Abrir en Codoritmo

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

binary-search.psc · 53 líneas
// 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."FinAlgoritmo

Diagrama de flujo

Cada bloque del diagrama corresponde a una instrucción del código.

Algoritmo BusquedaBinaria
Algoritmo BusquedaBinariaSíNoSíNoSíNoSíNoAlgoritmo BusquedaBinariaAlgoritmo BusquedaBinariaDefinir datos, n, i, buscado, izquierda, derecha, medio, posicion, pasos Como EnteroDefinir datos, n, i, buscado,izquierda, derecha, medio,posicion, pasos Como EnteroEscribir "¿Cuántos números tiene la lista? (1 a 512)"Escribir "¿Cuántos númerostiene la lista? (1 a 512)"Leer nLeer nDimension datos[n]Dimension datos[n]Para i <- 1 Hasta n HacerPara i <- 1 Hasta ndatos[i] <- 2 * idatos[i] <- 2 * iMostrarDatos("Lista: ", datos, n)MostrarDatos("Lista: ",datos, n)buscado <- Aleatorio(1, 2 * n)buscado <- Aleatorio(1, 2 * n)Escribir "Buscando el ", buscadoEscribir "Buscando el ",buscadoizquierda <- 1izquierda <- 1derecha <- nderecha <- nposicion <- 0posicion <- 0pasos <- 0pasos <- 0Mientras izquierda <= derecha Y posicion = 0 Hacerizquierda <= derechaY posicion = 0medio <- Trunc((izquierda + derecha) / 2)medio <- Trunc((izquierda +derecha) / 2)pasos <- pasos + 1pasos <- pasos + 1Escribir " Paso ", pasos, ": miro la posición ", medio, " (", datos[medio], ")"Escribir " Paso ", pasos, ":miro la posición ", medio, "(", datos[medio], ")"Si datos[medio] = buscado Entoncesdatos[medio] =buscadoposicion <- medioposicion <- medioSi datos[medio] < buscado Entoncesdatos[medio] <buscadoizquierda <- medio + 1izquierda <- medio + 1derecha <- medio - 1derecha <- medio - 1Si posicion > 0 Entoncesposicion > 0Escribir "Encontrado: el ", buscado, " está en la posición ", posicion, "."Escribir "Encontrado: el ",buscado, " está en la posición", posicion, "."Escribir "El ", buscado, " no está en la lista."Escribir "El ", buscado, " noestá en la lista."Escribir "Comparaciones: ", pasos, " de ", n, " elementos."Escribir "Comparaciones: ",pasos, " de ", n, "elementos."FinAlgoritmoFinAlgoritmo
SubProceso MostrarDatos
SubProceso MostrarDatosSíNoSubProceso MostrarDatos(titulo, datos, n)SubProceso MostrarDatos(titulo,datos, n)Definir i Como EnteroDefinir i Como EnteroSi n <= 30 Entoncesn <= 30Escribir Sin Saltar tituloEscribir Sin Saltar tituloPara i <- 1 Hasta n HacerPara i <- 1 Hasta nEscribir Sin Saltar datos[i], " "Escribir Sin Saltar datos[i]," "Escribir ""Escribir ""Escribir titulo, n, " números (el primero es ", datos[1], " y el último ", datos[n], ")"Escribir titulo, n, " números(el primero es ", datos[1], "y el último ", datos[n], ")"FinSubProcesoFinSubProceso

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).

Complejidad
CasoCosto
MejorO(1)
PromedioO(log n)
PeorO(log n)
MemoriaO(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.

Abrir en Codoritmo
  • Ordenamiento burbuja

    Ordena números al azar intercambiando vecinos, y se detiene apenas quedan ordenados.

    Intermedio
  • Ordenamiento por inserción

    Inserta cada número entre los ya ordenados, como al acomodar cartas en la mano.

    Intermedio
  • Ordenamiento Shell

    Una inserción entre elementos lejanos, con un salto que se achica en cada pasada.

    Avanzado