Menu
Coddy logo textTech

Busca binária

Última atualização

A busca binária encontra um valor-alvo em um array **ordenado** reduzindo repetidamente a janela de busca pela metade. Ela compara o elemento do meio com o alvo: se forem iguais, a busca termina; caso contrário, a metade que não pode conter o alvo é descartada e a janela encolhe para a outra metade. Cada comparação elimina metade dos elementos restantes, e é por isso que ela roda em O(log n) — buscar entre um milhão de valores ordenados exige no máximo cerca de 20 comparações.

A animação acima mostra os ponteiros lo, mid e hi e escurece a metade eliminada após cada comparação. A única pré-condição inegociável: o array já precisa estar ordenado — em dados desordenados você precisa da busca linear ou de uma ordenação primeiro (veja o merge sort). A mesma ideia de dividir ao meio move a árvore binária de busca.

Complexidade de tempo e espaço

CasoComplexidadeObservações
Melhor casoO(1)O elemento do meio é o alvo na primeira comparação.
Caso médioO(log n)Cada comparação reduz pela metade a janela restante.
Pior casoO(log n)A janela encolhe até um único elemento antes de acertar ou falhar.
EspaçoO(1)A versão iterativa guarda apenas os índices lo, hi e mid.

Passo a passo

PassoO que acontece
1Defina lo como o primeiro índice e hi como o último índice do array ordenado.
2Calcule o índice do meio: mid = (lo + hi) // 2.
3Se a[mid] for igual ao alvo, retorne mid — encontrado.
4Se a[mid] for **menor** que o alvo, o alvo só pode estar na metade direita: defina lo = mid + 1.
5Se a[mid] for **maior** que o alvo, busque na metade esquerda: defina hi = mid - 1.
6Repita a partir do passo 2 enquanto lo <= hi; se a janela esvaziar, o alvo não está no array.

Exemplo resolvido

Buscando 5 em [1, 2, 3, 5, 7, 8, 9]:

PassagemJanela (lo..hi)mida[mid]Ação
1[1, 2, 3, 5, 7, 8, 9] (0..6)35a[3] = 5 — alvo encontrado no índice 3.

Uma busca sem sucesso, passo a passo

Buscar 4 no mesmo array mostra como a janela esvazia:

PassagemJanela (lo..hi)mida[mid]Ação
10..6355 > 4 — busque na metade esquerda, hi = 2.
20..2122 < 4 — busque na metade direita, lo = 2.
32..2233 < 4lo vira 3, a janela esvazia: não encontrado.

Quando usar a busca binária

Use quandoEvite quando
Os dados já estão ordenados (ou você os busca muitas vezes)Os dados estão desordenados e são buscados apenas uma vez — ordenar primeiro custa O(n log n)
A coleção permite acesso aleatório rápido (arrays)Você só tem acesso sequencial (listas encadeadas)
O conjunto de dados é grande — O(log n) brilha em escalaO conjunto de dados é minúsculo — uma varredura simples é igualmente rápida e mais simples

Uma implementação limpa e executável de Binary Search em Python, JavaScript, Java, C++, C, Pseudocode. Escolha uma linguagem, copie o código ou abra-o já carregado no Playground da Coddy.

Código de Binary Search em Python

Python
1def binary_search(a, target):2    lo, hi = 0, len(a) - 13    while lo <= hi:4        mid = (lo + hi) // 25        if a[mid] == target:6            return mid7        if a[mid] < target:8            lo = mid + 1  # search the right half9        else:10            hi = mid - 1  # search the left half11    return -112
13
14nums = [1, 2, 3, 5, 7, 8, 9]  # must be sorted15print("Index of 5:", binary_search(nums, 5))16print("Index of 4:", binary_search(nums, 4))
Execute este código no Playground de Python

Perguntas frequentes sobre busca binária

Qual é a complexidade de tempo da busca binária?
O(log n) nos casos médio e pior, porque cada comparação reduz pela metade a janela de busca restante, e O(1) no melhor caso, quando o primeiro elemento do meio é o alvo. A versão iterativa usa O(1) de espaço extra.
Por que a busca binária exige um array ordenado?
O passo de dividir ao meio depende da ordem: comparar o alvo com o elemento do meio só indica qual metade descartar se tudo à esquerda do meio for menor e tudo à direita for maior. Em dados desordenados essa inferência é inválida — use a busca linear em vez disso, ou ordene primeiro.
Qual é a diferença entre busca binária e busca linear?
A busca linear percorre os elementos um a um (O(n)) e funciona em qualquer array; a busca binária divide ao meio a janela de busca de um array ordenado (O(log n)), mas exige entrada ordenada. Para poucos itens a diferença é insignificante — em escala, a busca binária vence com folga.
Quantas comparações a busca binária precisa fazer?
No máximo cerca de log2(n) + 1: 10 comparações cobrem 1.000 elementos, 20 comparações cobrem 1.000.000. Esse crescimento logarítmico é o que a torna a busca padrão em dados ordenados.
Qual é o clássico bug de overflow na busca binária?
Calcular o meio como (lo + hi) / 2 pode estourar inteiros de tamanho fixo quando lo + hi excede o máximo do tipo. A forma segura é mid = lo + (hi - lo) / 2. Em Python isso não importa (inteiros de precisão arbitrária), mas em Java/C/C++ é um bug real e famoso.
Busca binária é o mesmo que árvore binária de busca?
Elas compartilham a ideia de dividir ao meio, mas diferem na estrutura: a busca binária é um algoritmo sobre um array ordenado, enquanto a árvore binária de busca é uma estrutura de dados encadeada que mantém as chaves ordenadas para que as buscas desçam à esquerda ou à direita em cada nó.
Coddy programming languages illustration

Domine algoritmos com a Coddy

COMEÇAR