Skip to content

Instantly share code, notes, and snippets.

@parzibyte
Created August 7, 2019 17:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save parzibyte/655217826c189e2de2852a6e662a5d42 to your computer and use it in GitHub Desktop.
Save parzibyte/655217826c189e2de2852a6e662a5d42 to your computer and use it in GitHub Desktop.
<?php
/**
*
* Implementación del algoritmo de búsqueda binaria secuencial en un arreglo
* usando PHP
* Nota: este método sólo funciona con cadenas
* Para saber cómo se comparan las cadenas, visita:
* https://parzibyte.me/blog/2018/10/22/comparar-cadenas-strcmp-php/
*
* Autor: parzibyte
* Web: parzibyte.me/blog
*/
function busquedaBinaria(array &$arreglo, string $busqueda)
{
$izquierda = 0;
$derecha = count($arreglo) - 1;
#Mientras el arreglo se pueda partir...
while ($derecha >= $izquierda) {
# Obtener el valor y elemento de la mitad del arreglo
$indiceDelElementoMedio = floor(($izquierda + $derecha) / 2);
$elementoDelMedio = $arreglo[$indiceDelElementoMedio];
# Esta función devuelve un número menor a 0 si la cadena 1 es menor que la cadena 2
# en caso de que la 1 sea mayor que la 2, devuelve un número mayor a 0
# y si ambas son iguales devuelve 0
$resultadoDeLaComparacion = strcmp($busqueda, $elementoDelMedio);
# ¿Lo que buscamos está en la mitad del arreglo? entonces regresa el índice
if ($resultadoDeLaComparacion === 0) {
return $indiceDelElementoMedio;
} else {
# Si no, partimos el arreglo dependiendo de la búsqueda
if ($resultadoDeLaComparacion > 0) {
# Si está a la derecha, lo partimos desde el medio + 1 hasta el elemento dado por derecha
$izquierda = $indiceDelElementoMedio + 1;
} else {
# Si está a la izquierda, lo partimos desde el medio - 1 hasta el elemento dado por izquierda
$derecha = $indiceDelElementoMedio - 1;
}
}
# El ciclo continúa, pero ya cambiamos izquierda o derecha según haya sido el caso
}
# Si llegamos a este punto es porque la búsqueda no se encuentra
return -1;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment