Módulo 9 - Ordenação eficiente: merge sort e quick sort

Merge sort: dividir e intercalar

9 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 12/07/2026

O que você vai aprender

  • Entender as três fases do merge sort: dividir, ordenar as metades e intercalar.
  • Compreender por que intercalar duas listas ordenadas é uma operação barata.
  • Seguir a recursão do merge sort até o caso base de um único elemento.
  • Colocar os passos do merge sort na ordem correta.

As três fases do merge sort

O merge sort segue à risca o roteiro de dividir para conquistar. A fase de dividir é trivial: encontre o meio e parta a lista em duas metades, esquerda e direita. A fase de conquistar não faz nada de novo, apenas confia na recursão: para ordenar a metade esquerda, o algoritmo chama a si mesmo sobre ela; para a direita, idem. Essa confiança parece mágica, mas se sustenta no caso base. Quando uma metade encolhe até ter um único elemento, ela já está ordenada, porque um elemento sozinho não tem como estar fora de ordem. A recursão então para de descer e começa a subir, e é na subida que acontece o trabalho de verdade.

A fase que dá nome ao algoritmo é a combinação, a intercalação. Ao voltar da recursão, você tem em mãos duas metades já ordenadas e precisa fundi-las numa lista maior também ordenada. Aqui está a beleza: intercalar duas listas ordenadas é fácil e rápido. Você olha o primeiro elemento de cada metade, pega o menor dos dois, coloca no resultado e avança naquela metade. Repete até esvaziar as duas. Como cada elemento é olhado uma única vez, intercalar custa proporcional ao tamanho total. É essa intercalação barata, feita em cada nível da recursão, que dá ao merge sort o seu custo O(n log n).

Diagrama em árvore mostrando o merge sort sobre a lista 6, 2, 8, 4. Na parte de cima, a lista se divide em 6, 2 e 8, 4, e depois em elementos isolados 6, 2, 8, 4. Setas para baixo marcam a fase dividir. Na parte de baixo, setas para cima marcam a fase intercalar: 6 e 2 viram 2, 6; 8 e 4 viram 4, 8; e por fim as duas metades ordenadas 2, 6 e 4, 8 se intercalam na lista final 2, 4, 6, 8.
O merge sort desce dividindo até elementos isolados e sobe intercalando pares ordenados até a lista completa.

A intercalação por dentro

Vale ver a intercalação em detalhe, porque é o coração do algoritmo. Imagine duas metades ordenadas: a esquerda é 2, 6 e a direita é 4, 8. Você mantém um marcador na frente de cada uma. Compara 2 com 4: o 2 é menor, vai para o resultado e o marcador da esquerda avança. Agora compara 6 com 4: o 4 é menor, vai para o resultado e o marcador da direita avança. Compara 6 com 8: o 6 vai. Sobrou só o 8 na direita, que entra por último. Resultado: 2, 4, 6, 8. Repare que você nunca voltou atrás nem comparou tudo com tudo; cada elemento foi visitado uma vez só.

FUNÇÃO intercalar(esquerda, direita)
  resultado <- []
  i <- 0   // marcador da esquerda
  j <- 0   // marcador da direita
  ENQUANTO i < tamanho(esquerda) E j < tamanho(direita) FAÇA
    SE esquerda[i] <= direita[j] ENTÃO
      adicionar(resultado, esquerda[i])
      i <- i + 1
    SENÃO
      adicionar(resultado, direita[j])
      j <- j + 1
    FIM
  FIM
  // um dos lados pode ter sobrado; joga o resto no fim
  adicionar_resto(resultado, esquerda, i)
  adicionar_resto(resultado, direita, j)
  RETORNE resultado
FIM

Dois marcadores caminham pelas metades ordenadas, escolhendo sempre o menor da frente. O que sobrar de um lado entra no fim.

🎮 Jogo da aula

Monte o merge sort na ordem

Coloque os passos do merge sort na sequência correta, de cima para baixo.

    O custo e o preço a pagar

    Por que o merge sort é O(n log n)? Pense nos níveis da divisão. A lista de n itens vira duas de n meios, depois quatro de n quartos, e assim por diante, até sobrarem pedaços de um elemento. O número de níveis dessa descida é log n, porque a lista é partida ao meio a cada nível. Em cada nível, a intercalação de todos os pedaços daquele nível percorre no total os n elementos. Logo, são log n níveis, cada um custando n: o produto é n vezes log n. E, diferente do quick sort que você verá adiante, esse custo vale sempre, no melhor e no pior caso, porque a divisão pela metade não depende dos valores da lista.

    Teste rápido

    Por que intercalar duas listas já ordenadas é uma operação rápida?

    Perguntas frequentes

    O merge sort ordena a lista original ou cria uma nova?
    Na versão clássica, ele cria listas novas durante a intercalação e devolve uma lista ordenada, sem alterar a original. É por isso que se diz que ele não é in-place: gasta memória extra proporcional ao tamanho da entrada. Existem variações mais econômicas de memória, mas elas complicam o código.
    Por que o merge sort tem custo garantido, sem pior caso ruim?
    Porque a divisão é sempre pela metade exata, independentemente dos valores. Isso garante log n níveis sempre, e cada nível intercala n elementos. O resultado é n log n no melhor, no médio e no pior caso. O quick sort, que você verá a seguir, depende da escolha do pivô e pode degradar.
    O que é o caso base do merge sort?
    É uma lista com um único elemento (ou vazia). Ela já está ordenada por definição, porque não há dois elementos para ficarem fora de ordem. Ao chegar nesse tamanho, a recursão para de dividir e começa a subir, intercalando os pedaços de volta em listas cada vez maiores.
    A intercalação precisa das duas metades ordenadas mesmo?
    Sim, é a condição que faz tudo funcionar. Se as metades não estivessem ordenadas, comparar só os elementos da frente não garantiria pegar o menor de todos. A recursão é justamente o que assegura que, na hora de intercalar, as duas partes já chegaram ordenadas de baixo.
    O merge sort serve para ordenar textos e não só números?
    Serve para qualquer coisa que se possa comparar por ordem: números, palavras em ordem alfabética, datas, o que for. O algoritmo não muda; o que muda é a regra de comparação usada na intercalação. Trocar o critério de menor por antes na ordem alfabética já ordena textos.
    Onde o merge sort é usado na prática?
    Ele é a base de ordenações estáveis em várias linguagens e bibliotecas, sozinho ou combinado com outros métodos. Por garantir O(n log n) e preservar a ordem de itens iguais, é escolhido quando a estabilidade importa, por exemplo ao ordenar uma tabela por uma coluna sem bagunçar a ordem anterior.

    Fontes

    Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.