Trilha 03 · Algoritmos e complexidade

Visualizador de ordenação

Ordenar parece trivial — mas como você ordena muda totalmente quantas operações são necessárias.

① Intuição

Existe mais de um jeito de organizar

Imagine organizar um baralho na mão. Você pode comparar cartas vizinhas e ir trocando até ficar em ordem (é o bubble sort), ou pegar uma carta de cada vez e encaixá-la no lugar certo entre as que já estão organizadas (insertion sort).

Os dois funcionam. Mas para 1 milhão de cartas, um deles pode levar segundos e o outro horas. É exatamente essa diferença que a visualização abaixo deixa óbvia.

② Visualização interativa

Veja o algoritmo trabalhando

Escolha um algoritmo, ajuste o tamanho e a velocidade, e clique em Ordenar. Amarelo = comparando · vermelho = trocando · verde = posição final.

Comparações: 0
Trocas: 0
Status: pronto

Experimente o bubble sort com 80 elementos e depois o quicksort com o mesmo tamanho. A diferença no número de comparações é o coração do próximo tópico.

③ Explicação técnica

Custo: quanto cresce o trabalho?

Medimos algoritmos por como o número de operações cresce conforme a entrada (n) aumenta — a notação Big O.

Algoritmo      Pior caso     Estável?   Estratégia
Bubble sort    O(n²)         sim        trocas entre vizinhos
Insertion      O(n²)         sim        insere no lugar certo
Selection      O(n²)         não        acha o menor e move
Quicksort      O(n²)*        não        divide por um pivô
Merge sort     O(n log n)    sim        divide e conquista

* na prática quicksort é O(n log n); o pior caso é raro

O(n²) significa: dobrar a entrada multiplica o trabalho por ~4. Já O(n log n) cresce quase linearmente. Para n = 1.000.000, isso é a diferença entre ~1 trilhão e ~20 milhões de operações.

Quando usar cada um: para listas pequenas ou quase ordenadas, insertion sort é ótimo e simples. Para uso geral, linguagens usam variações de quicksort e merge sort (o sort() do JavaScript, por exemplo).
④ Projeto para programar

Implemente e meça

Mini projeto: escreva o bubble sort e conte quantas comparações ele faz.

function bubbleSort(a) {
  let comparacoes = 0;
  for (let i = 0; i < a.length; i++) {
    for (let j = 0; j < a.length - 1 - i; j++) {
      comparacoes++;
      if (a[j] > a[j + 1]) {
        [a[j], a[j + 1]] = [a[j + 1], a[j]]; // troca
      }
    }
  }
  return comparacoes;
}

Projeto principal: um benchmark que roda bubble e merge sort no mesmo array e compara as comparações.

Desafio extra: recrie este visualizador gravando os passos (compare/troca) e animando-os.

⑤ Exercícios rápidos

Teste sua intuição

Qual algoritmo tem o melhor pior-caso para listas grandes?
Se você dobra a entrada de um algoritmo O(n²), o trabalho fica aproximadamente:
Para uma lista quase ordenada e pequena, uma ótima escolha simples é:
⑥ Aplicações no mundo real

Onde você encontra isso

📊

Ordenar tabelas

Clicar no cabeçalho de uma coluna dispara um algoritmo de ordenação.

🔎

Busca binária

Só funciona em dados ordenados — por isso ordenar vem antes.

🏆

Rankings e feeds

Ordenar posts por data, relevância ou pontuação.

🗄️

Bancos de dados

ORDER BY usa índices e algoritmos de ordenação eficientes.

← Anterior: Busca Próxima: Recursão →