Avendo una sequenza di elementi ordinata, si può progettare un albero di ricerca migliore della ricerca lineare.

La ricerca binaria consiste nel prendere l’elemento a metà dello spazio di ricerca, se è minore* rispetto a quello cercato, allora si cerca nella seconda metà, mentre se è maggiore* si cerca nella prima metà, invece se corrisponde a quello cercato si finisce.

*serve un criterio che ordini lo spazio di ricerca rendendo possibile giudicare un elemento minore o maggiore di un altro, come l’ordinamento per lunghezza, l’ordine alfabetico o altro.

Rispetto alla ricerca lineare, il numero di elementi da controllare in futuro dimezza a ogni iterazione, quindi ha complessità .

implementazione su una lista in Python

def ricerca_binaria(lista, query):
 
    inizio = 0
    fine = len(lista)-1
 
    while inizio <= fine:
 
        mezzo = (inizio + fine) // 2
 
        if lista[mezzo] == query:
            return True
 
        elif lista[mezzo] > query:
            fine = mezzo - 1
 
        elif lista[mezzo] < query:
            inizio = mezzo + 1
 
    return False

implementazione ricorsiva

def ricerca_binaria(lista, query, inizio=0, fine=None):
 
    if fine == None:
        fine = len(lista)-1
 
	# se dopo troppe divisioni la lista si rimpicciolisce fino ad avere un numero negativo di elementi, bisogna fermarsi
    if inizio > fine:
        return False
    
    mezzo = (inizio + fine) // 2
 
    if lista[mezzo] == query:
        return True
 
    elif lista[mezzo] > query:
        fine = mezzo-1
 
    elif lista[mezzo] < query:
        inizio = mezzo+1
 
	# chiamata ricorsiva
    return ricerca_binaria(lista, query, inizio, fine)
 
    return False