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

Quick sort: pivô e partição

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

O que você vai aprender

  • Entender o quick sort como escolher pivô, particionar e repetir.
  • Compreender por que o pivô já fica na posição final após a partição.
  • Reconhecer o melhor e o pior caso do quick sort segundo a escolha do pivô.
  • Prever a saída de um passo de partição.

A ideia do pivô

O merge sort divide a lista no meio geométrico, sem olhar os valores. O quick sort faz diferente: ele escolhe um valor, o pivô, e usa esse valor para dividir. A escolha do pivô pode ser o primeiro elemento, o último, o do meio ou um aleatório. Uma vez escolhido, o algoritmo reorganiza a lista de modo que tudo que é menor que o pivô fique de um lado e tudo que é maior fique do outro. Essa reorganização é a partição. Note que os dois lados ainda não estão ordenados entre si; só está garantido que um lado tem os pequenos e o outro tem os grandes em relação ao pivô.

O detalhe mais elegante é o que acontece com o pivô. Depois da partição, com os menores à esquerda e os maiores à direita, o pivô é encaixado bem no meio, entre os dois grupos. E aí ele já está no lugar definitivo da lista ordenada, porque nenhum elemento menor pode estar à sua direita e nenhum maior à sua esquerda. Isso significa que a cada partição pelo menos um elemento, o pivô, fica resolvido para sempre. O quick sort então repete a mesma receita nos dois lados: escolhe um novo pivô na parte esquerda, particiona, e faz o mesmo na parte direita. Quando os pedaços chegam a um elemento, tudo está ordenado.

Diagrama do quick sort sobre a lista 5, 3, 8, 1, 7 com pivô 5 destacado. Uma seta mostra a partição: à esquerda do pivô ficam 3 e 1 (menores), à direita ficam 8 e 7 (maiores), e o pivô 5 no centro é marcado como posição final. Abaixo, dois ramos indicam o quick sort sendo aplicado de novo na parte esquerda 3, 1 e na parte direita 8, 7.
Após particionar em torno do pivô 5, ele já está no lugar definitivo; o algoritmo repete nas partes da esquerda e da direita.

A partição passo a passo

A partição parece complicada, mas é um caminhar simples pela lista. Escolha o último elemento como pivô. Mantenha um marcador que aponta onde termina a região dos menores, começando antes do início. Percorra a lista do começo até o penúltimo. Sempre que encontrar um elemento menor ou igual ao pivô, avance o marcador e troque esse elemento para dentro da região dos menores. Ao terminar a varredura, o marcador aponta o fim dos menores; troque o pivô para logo depois dele. Pronto: à esquerda ficaram os menores, à direita os maiores, e o pivô no meio, no seu lugar final. É esse ponto de corte que o algoritmo devolve para dividir a lista.

FUNÇÃO quick_sort(lista, inicio, fim)
  SE inicio < fim ENTÃO
    p <- particionar(lista, inicio, fim)   // p e a posicao final do pivo
    quick_sort(lista, inicio, p - 1)       // ordena o lado dos menores
    quick_sort(lista, p + 1, fim)          // ordena o lado dos maiores
  FIM
FIM

FUNÇÃO particionar(lista, inicio, fim)
  pivo <- lista[fim]
  i <- inicio - 1
  PARA j DE inicio ATÉ fim - 1 FAÇA
    SE lista[j] <= pivo ENTÃO
      i <- i + 1
      trocar(lista, i, j)
    FIM
  FIM
  trocar(lista, i + 1, fim)   // poe o pivo depois dos menores
  RETORNE i + 1
FIM

A partição varre a lista trocando os menores para a frente; no fim, o pivô vai para o ponto de corte e a função devolve essa posição.

🎮 Jogo da aula

Onde o pivô para?

Após particionar esta lista com o último elemento como pivô, veja o que o programa mostra.

lista <- [4, 2, 7, 1]
// pivo = 1 (ultimo elemento)
// menores ou iguais a 1: nenhum antes do pivo
// entao o pivo vai para o inicio (posicao 0)
// resultado apos a particao:
escreva([1, 4, 2, 7])

Rápido, mas com um pior caso

Na média, o quick sort é O(n log n) e costuma bater o merge sort no relógio, porque particiona no próprio lugar da lista, sem gastar memória extra para uma cópia. Mas ele tem um calcanhar. Se o pivô escolhido for quase sempre o menor ou o maior elemento, a partição fica desbalanceada: um lado quase vazio, o outro quase inteiro. Aí, em vez de cortar pela metade, o algoritmo tira só um elemento por vez, e o custo desaba para O(n ao quadrado), o mesmo dos métodos simples. Esse pior caso aparece, por exemplo, ao rodar o quick sort ingênuo (pivô no último) sobre uma lista já ordenada. A defesa é escolher o pivô com esperteza: pegar o do meio, um aleatório, ou a mediana de três candidatos.

Teste rápido

Depois de uma partição do quick sort, o que se pode afirmar sobre o pivô?

Perguntas frequentes

Qual é a diferença central entre quick sort e merge sort?
O merge sort divide no meio geométrico e faz o trabalho na hora de intercalar, gastando memória extra. O quick sort divide pelo valor do pivô e faz o trabalho na partição, no próprio lugar da lista. O merge sort garante O(n log n) sempre; o quick sort é O(n log n) na média, mas pode degradar com pivô ruim.
Por que o quick sort costuma ser mais rápido na prática?
Porque ele particiona in-place, trocando elementos dentro da própria lista, sem alocar uma lista nova como o merge sort faz. Menos cópia de dados e bom uso da memória do computador costumam torná-lo mais veloz no relógio, mesmo os dois tendo o mesmo custo teórico na média.
Como escolher um bom pivô?
As estratégias comuns são pegar um elemento aleatório ou usar a mediana de três candidatos (primeiro, meio e último). As duas evitam o pior caso em listas já ordenadas ou quase ordenadas, que é justamente onde o pivô ingênuo no extremo falha. A escolha aleatória torna o pior caso muito improvável.
O que significa o pivô cair na posição final?
Depois de particionar, tudo à esquerda do pivô é menor e tudo à direita é maior. Logo, o pivô já está exatamente onde estaria na lista ordenada, e nunca mais precisa se mover. É por isso que a recursão só precisa cuidar dos dois lados, deixando o pivô parado.
Quando o quick sort vira O(n ao quadrado)?
Quando as partições ficam sempre desbalanceadas, com o pivô sendo quase sempre o menor ou o maior elemento. Aí cada passo separa só um item em vez de metade, e o número de níveis vira n em vez de log n. O caso clássico é o pivô no extremo sobre uma lista já ordenada.
Quick sort e merge sort são recursivos?
Sim, os dois são exemplos diretos de dividir para conquistar com recursão: dividem o problema em partes menores e chamam a si mesmos sobre cada parte. A diferença está em como dividem e onde fazem o trabalho, mas a estrutura recursiva de descer dividindo e resolver os pedaços é comum aos dois.

Fontes

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