Algoritmos e estruturas de dados · Busca e ordenação · 5 min de leitura
Busca binária
Numa lista ordenada, olhe o meio e descarte metade: um milhão de itens em 20 comparações. E os detalhes que fazem quase toda implementação errar.
Arraste para o lado para ver o diagrama inteiro.
A ideia
Só funciona com a lista ordenada. Compare o alvo com o elemento do meio: se for maior, ele só pode estar à direita; se for menor, à esquerda. Cada passo descarta metade, então o número de passos é log₂ n — O(log n).
Os erros clássicos
(lo + hi) / 2pode estourar oIntcom listas enormes — o bug que ficou anos noArrays.binarySearchdo Java. Uselo + (hi − lo) / 2.- Misturar intervalo fechado
[lo, hi]com aberto[lo, hi): decida um e ajustewhile (lo <= hi)ehi = meio − 1de acordo. - Esquecer de mover
loouhipara além do meio e entrar em laço infinito.
Muito além de achar um número
Busca binária serve para achar o primeiro item que satisfaz uma condição (o primeiro dia com estoque zerado, o commit que quebrou o build com git bisect) e até para "chutar" a resposta de um problema numérico. Na prática, use binarySearch do Kotlin ou partitioningIndex do Swift Algorithms.
No código: antes e depois
fun busca(a: IntArray, alvo: Int): Int {
var lo = 0; var hi = a.size - 1
while (lo < hi) { // perde o caso lo == hi
val meio = (lo + hi) / 2 // pode estourar o Int
if (a[meio] < alvo) lo = meio else hi = meio // pode travar
}
return if (a[lo] == alvo) lo else -1 // quebra com array vazio
} fun busca(a: IntArray, alvo: Int): Int {
var lo = 0
var hi = a.size - 1 // intervalo fechado [lo, hi]
while (lo <= hi) {
val meio = lo + (hi - lo) / 2
when {
a[meio] == alvo -> return meio
a[meio] < alvo -> lo = meio + 1
else -> hi = meio - 1
}
}
return -1 // ou use a.binarySearch(alvo)
} Na versão ruim, com lo = 0, hi = 1 e alvo maior que a[0], meio fica 0 para sempre. A boa sempre encolhe o intervalo e cobre o array vazio.
Em resumo
- Exige lista ordenada.
- Corta o intervalo pela metade: O(log n).
- Meio seguro: lo + (hi − lo) / 2.
- Escolha um tipo de intervalo e seja coerente.
- git bisect é busca binária no histórico.
Exercícios
Responda e confira na hora. Complexidades valem com ou sem espaços, como O(n log n).
-
No máximo, quantas comparações a busca binária faz numa lista ordenada de 1.000.000 de itens?
Ver a solução
Resposta: 20. 2²⁰ = 1.048.576 ≥ 1.000.000, então 20 cortes pela metade bastam (log₂ 1.000.000 ≈ 19,9).
-
Buscando 23 em [2, 5, 8, 12, 16, 23, 38, 56, 72, 91] com meio = (lo + hi) / 2 arredondado para baixo, qual é o índice do primeiro meio?
Ver a solução
Resposta: 4. lo = 0, hi = 9: (0 + 9) / 2 = 4,5 → 4. O elemento é 16.
-
Qual a condição que a lista precisa cumprir para a busca binária funcionar?
Ver a solução
Resposta: ordenada. Só numa lista ordenada dá para saber de que lado do meio o alvo está.
Perguntar à IA
Monte um prompt pronto sobre Busca binária na sua linguagem e no seu caso, e abra num chat gratuito.
O prompt vai para o site que você escolher. Não cole senhas, tokens nem dados reais de clientes. Para Gemini e outros, copie e cole.