edubun
Português

Ordenação 1: bubble sort, selection sort e insertion sort

O selection sort faz exatamente 45 comparações em qualquer lista de 10 valores, esteja ela embaralhada ou já em ordem.

Pondo as coisas em ordem

Ordenar quer dizer rearranjar uma lista para que os valores vão do menor para o maior (ou por nome, data, preço, qualquer ordem que se possa comparar). É um dos trabalhos mais comuns de um computador: os contatos do celular, os resultados de busca por relevância, uma coluna de planilha ordenada por data. Ordenar também facilita outros trabalhos. Como a unidade anterior mostrou, uma lista ordenada pode ser buscada com busca binária, e numa lista ordenada os valores repetidos ficam lado a lado.

Esta unidade trata de três métodos simples. Os três funcionam comparando dois valores por vez e movendo valores dentro da própria lista. São curtos de escrever e fáceis de acompanhar, e os três ficam muito lentos em listas compridas. Ver por que eles ficam lentos é a melhor preparação para os métodos mais rápidos da próxima unidade. O tempo todo, contamos duas coisas: comparações (perguntar "este valor é maior que aquele?") e trocas (trocar dois valores de lugar).

Bubble sort: troque vizinhos fora de ordem

O bubble sort (ordenação por bolha) percorre a lista comparando cada par de vizinhos. Quando o da esquerda é maior, ele troca os dois. Depois de uma passada completa, o maior valor foi levado passo a passo até a ponta direita, como uma bolha subindo, e nunca mais precisa se mover. A passada seguinte pode parar uma casa antes. Uma melhoria comum é observar se houve uma passada sem nenhuma troca: isso quer dizer que tudo já está em ordem, então a ordenação pode parar antes.

Acompanhe na lista [5, 1, 4, 2, 8]. A primeira passada compara 5 e 1 (troca), 5 e 4 (troca), 5 e 2 (troca), 5 e 8 (deixa): a lista agora é [1, 4, 2, 5, 8] e o 8 está no lugar. A segunda passada compara 1 e 4, 4 e 2 (troca), 4 e 5, e dá [1, 2, 4, 5, 8]. A terceira passada compara 1 e 2, depois 2 e 4, não faz troca e para. Total: 4 + 3 + 2 = 9 comparações e 4 trocas.

function bubbleSort(a) {
  for (let pass = 0; pass < a.length - 1; pass++) {
    let swapped = false;
    for (let j = 0; j < a.length - 1 - pass; j++) {
      if (a[j] > a[j + 1]) {
        [a[j], a[j + 1]] = [a[j + 1], a[j]];  // troca
        swapped = true;
      }
    }
    if (!swapped) break;  // já está ordenada
  }
  return a;
}

Selection sort: ache o menor e ponha em seguida

O selection sort (ordenação por seleção) funciona do jeito como muita gente arruma as cartas na mão. Percorra a lista inteira atrás do menor valor e troque-o para a primeira posição. Depois percorra o resto atrás do menor valor que sobrou e troque-o para a segunda posição, e assim por diante. Em [5, 1, 4, 2, 8], a primeira varredura acha o 1 e o troca com o 5; a segunda acha o 2 e o troca com o 5; as duas últimas varreduras acham 4 e 5 já no lugar. São só 2 trocas, mas as varreduras ainda comparam 4 + 3 + 2 + 1 = 10 vezes.

O selection sort nunca para antes. Mesmo numa lista que já está ordenada, ele ainda precisa verificar cada valor restante para ter certeza de que achou o menor. Para n valores, as comparações sempre somam (n − 1) + (n − 2) + … + 1 = n(n − 1)/2. Para 10 valores isso dá 45; para 100 valores, 4950; para 1000 valores, 499 500. O ponto forte dele é o número pequeno de trocas: no máximo n − 1, o que importa quando mover um valor custa caro.

Insertion sort: deslize cada valor novo até o lugar

O insertion sort (ordenação por inserção) mantém a parte esquerda da lista ordenada e a aumenta um valor por vez. Ele pega o próximo valor e o move para a esquerda, trocando com o vizinho, até o vizinho não ser maior. Aí esse valor está no lugar entre os ordenados. Numa lista que já está quase em ordem, cada valor novo anda só um ou dois passos, então o insertion sort é muito rápido nesse caso. Em [5, 1, 4, 2, 8] ele faz 7 comparações e 4 trocas.

Carregando

Arraste para girar. Role ou faça pinça para dar zoom.

A lista [5, 1, 4, 2, 8]. Alterne entre os três métodos e confira as contagens desta unidade. Depois escolha Invertida ou Já ordenada para ver o melhor e o pior caso.

Contando as trocas: inversões

Há um jeito elegante de prever quantas trocas o bubble sort e o insertion sort precisam. Conte as inversões: pares de valores que estão na ordem errada um em relação ao outro. Em [5, 1, 4, 2, 8] as inversões são (5, 1), (5, 4), (5, 2) e (4, 2), quatro ao todo. Cada troca de dois vizinhos fora de ordem corrige exatamente uma inversão e não cria nenhuma, então os dois métodos fazem exatamente 4 trocas. Uma lista invertida de n valores tem todos os pares invertidos, n(n − 1)/2 inversões, que é o pior caso.

MétodoExemploOrdenada (5 valores)Invertida (4 valores)
Bubble sort9 / 44 / 06 / 6
Selection sort10 / 210 / 06 / 2
Insertion sort7 / 44 / 06 / 6

Cada célula mostra comparações / trocas. A lista de exemplo é [5, 1, 4, 2, 8]. O bubble sort aqui é a versão que para depois de uma passada sem troca.

Os três métodos têm a mesma fraqueza. No pior caso, cada um compara mais ou menos todos os pares de valores, cerca de n²/2 comparações. Dobre a lista e o trabalho fica quatro vezes maior. Dez vezes a lista quer dizer cem vezes o trabalho. Para algumas dezenas de valores isso pouco importa; para um milhão é inviável, e a próxima unidade mostra como fazer muito melhor.

comparaçãoPerguntar se um valor é maior que outro
trocaTrocar dois valores de posição
passadaUma viagem pela lista
bubble sortTroca vizinhos fora de ordem; o maior sobe até o fim a cada passada
selection sortAcha o menor valor restante e o troca para o próximo lugar
insertion sortDesliza cada valor novo para a esquerda, até a parte ordenada
inversãoUm par de valores na ordem errada um em relação ao outro
n(n − 1)/2O número de pares entre n valores
  1. Quantas comparações o selection sort faz em qualquer lista de 10 valores?
  2. Quantas inversões tem [3, 1, 2]?
  3. Quantas trocas o insertion sort faz em [4, 3, 2, 1]?
  4. Depois da primeira passada do bubble sort, qual valor certamente está no lugar final?
    • O menor, na frente
    • O maior, no fim
    • O valor do meio
    • Nenhum ainda
  5. Qual método faz menos trocas em [5, 1, 4, 2, 8]?
    • Bubble sort
    • Selection sort
    • Insertion sort
  6. Uma lista já está ordenada. Qual método ainda faz n(n − 1)/2 comparações?
    • Bubble sort com parada antecipada
    • Selection sort
    • Insertion sort
  7. Quantas comparações o bubble sort (com parada antecipada) faz em [5, 1, 4, 2, 8]?
  8. Uma lista de 1000 valores vira uma de 2000 valores. Mais ou menos como muda o trabalho do insertion sort no pior caso?
    • Dobra
    • Fica umas quatro vezes maior
    • Aumenta 1000 passos
    • Fica igual
  9. Qual método é a melhor escolha para uma lista que já está quase ordenada?
    • Insertion sort
    • Selection sort
    • Qualquer um, são todos iguais
  10. Quantos pares podem ser formados com 100 valores (a contagem de comparações no pior caso, n(n − 1)/2)?
  11. Ponha em ordem os estados por que a lista [3, 1, 2] passa durante o insertion sort.
Pontos-chave
  • O bubble sort troca vizinhos; cada passada leva o maior valor até o fim.
  • O selection sort sempre faz n(n − 1)/2 comparações e no máximo n − 1 trocas.
  • O insertion sort é rápido em listas quase ordenadas.
  • O bubble sort e o insertion sort fazem uma troca por inversão.
  • Os três levam cerca de n² passos no pior caso.
Fontes deste curso (11)
  • MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
  • lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
  • Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
  • with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
  • MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
  • D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
  • Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
  • Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
  • Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
  • Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
  • Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.

Data de verificação: 2026-10-17