Ordenação e estabilidade

Traçar ordenações, provar a intercalação e distinguir garantias de pior caso e custos esperados.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Que algoritmo custa o quê

AlgoritmoQuando é bomPior casoMemória extraMantém empates
SeleçãoTrocas caras e auxiliar O(1)O(1)Θ(n2)\Theta(n^2)O(1)O(1)Não
InserçãoEntrada quase ordenadaΘ(n2)\Theta(n^2)O(1)O(1)Sim
Bubble com paragemEntrada ordenadaΘ(n2)\Theta(n^2)O(1)O(1)Sim
MergesortGarantia em todos os casosΘ(nlog⁡n)\Theta(n\log n)O(n)O(n)Sim
QuicksortCaso médio rápidoΘ(n2)\Theta(n^2)Pilha até O(n)O(n)Não
  • Seleção faz sempre n(n-1)/2 comparações. Em [2A,2B,1] troca o 1 para a frente e inverte os 2.
  • Inserção custa Θ(n+I)\Theta(n+I) com I inversões. Só desloca elementos estritamente maiores.
  • Bubble só é linear com paragem quando não há trocas.

Intercalar sem falhar

Divide ao meio, ordena cada metade e junta pelas frentes. Na igualdade, tira da esquerda.

  1. Metades
    2, 61, 5
    1 sai da direita, depois 2 da esquerda.
  2. Resultado
    1256
    Três comparações; o 6 final copia-se.
Cada passo compara só as duas frentes disponíveis.

Recorrência T(n)=2T(n/2)+Θ(n)T(n)=2T(n/2)+\Theta(n) dá Θ(nlog⁡n)\Theta(n\log n). Guarda um auxiliar de n e reutiliza-o. Em lista ligada, separa por ligações e intercala sem copiar valores; a pilha fica O(log⁡n)O(\log n) e std::list ordena-se com lista.sort().

Partir para o quicksort

Com pivô p=v[r-1] em [l,r):

  1. Varre j e mantém menores à esquerda de i.
  2. Troca para i quando encontra valor menor que p.
  3. Põe o pivô em i e resolve cada lado.

Em [5,2,7,1,4], o pivô 4 termina em [2,1,4,5,7]. Equilíbrio dá Θ(nlog⁡n)\Theta(n\log n); isolar um de cada vez dá Θ(n2)\Theta(n^2). Pivô aleatório com chaves distintas dá O(nlog⁡n)O(n\log n) esperado. Todas iguais continuam quadráticas em Lomuto; separa três grupos para evitar esse caso. Hoare devolve fronteira, não posição final do pivô.

Quando não basta comparar

  • Um comparador válido define uma ordem fraca estrita: comp(x,x) é falso, comp é transitiva e a equivalência induzida também é transitiva. <= e diferenças com overflow falham. Referência: https://eel.is/c++draft/alg.sorting.general .
  • sort garante O(nlog⁡n)O(n\log n) comparações sem estabilidade. stable_sort conserva empates.
  • Comparar tem limite Ω(nlog⁡n)\Omega(n\log n) no pior caso para chaves distintas.
  • Counting com chaves em [0,k): conta, prefixa e distribui da direita para a esquerda. Custa Θ(n+k)\Theta(n+k).
  • Radix LSD com d dígitos de base b lê do menos para o mais significativo, sempre com passagem estável. Custa Θ(d(n+b))\Theta(d(n+b)).

Exemplos completos.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.