Problema resolvido na íntegra
-
Previsão exata da contagem de trocas do bubble sort em 64 elementos invertidos 7 passos
Execute a corrida na predefinição invertido — 64 elementos, o maior primeiro. Preveja a contagem de trocas do bubble sort exatamente, não a sua ordem de crescimento; depois diga o que impede qualquer algoritmo de troca de vizinhos de o superar.
-
Uma inversão é um par que está na ordem relativa errada. A entrada invertida é o extremo: para cada i < j o elemento anterior é o maior, pelo que todos os pares estão invertidos e a contagem é a totalidade deles. Obtenha este número antes que algo se mova — revela-se ser a totalidade do problema.
-
O bubble sort troca apenas vizinhos, e apenas quando estão fora de ordem. Tal troca repara esse único par e não perturba nenhum outro, porque os dois elementos que se movem mantêm a mesma relação com tudo o que está fora deles. Uma troca, uma inversão — nunca duas, nunca nenhuma.
-
Estar ordenado significa zero inversões. Começar em 2.016 e remover exatamente uma por troca não deixa margem de manobra: o número de trocas é forçado. O painel apresenta 2.016 trocas, e isso é uma identidade em vez de um limite de pior caso.
-
As comparações são uma contagem separada que por acaso coincide aqui. A passagem i analisa j = 0 … 62 − i, pelo que o total é 63 + 62 + ⋯ + 1 — os mesmos 2.016 que a linha pior caso do bubble n(n−1)/2 mostra. Contagens iguais significam que cada comparação individual encontrou uma inversão, que é o que "pior caso" significa aqui. O contador sob o título de cada painel conta um passo por comparação mais um por troca, pelo que indica passo 0 / 4.032 antes de começar, e o botão › consome exatamente um desses passos por clique. O O(n²) ao lado do título é um rótulo, não uma contagem.
-
Agora generalize o passo 2, pois é isto que o quicksort explora. Trocar duas entradas distanciadas por d posições deixa cada par formado com um elemento fora do intervalo inalterado no total: tal elemento é recomparado com a outra extremidade, as duas comparações trocam de lugar e a sua contribuição permanece inalterada. O que se pode mover é o próprio par, mais os 2(d − 1) pares que cada extremidade forma com as d − 1 entradas intermédias. No máximo 2d − 1 inversões podem ser eliminadas por troca, e definir d = 1 devolve a inversão única do passo 2.
-
A primeira partição do quicksort toma o elemento central como pivô, a[31] = 33, e troca (0, 63), (1, 62), … , (31, 32) — 32 trocas a distâncias de 63, 61, … , 1. O passo 5 limita o seu efeito combinado a 2.016 inversões, e essa única passagem deixa o vetor completamente ordenado, pelo que foram removidas exatamente 2.016. O limite é atingido com igualdade: cada uma das 32 trocas alcançou o seu próprio máximo.
-
Assim, os dois algoritmos não estão a competir em astúcia, estão a competir em alcance. As 334 comparações e 64 trocas apresentadas pelo quicksort somam os 398 no seu contador — e apenas 32 dessas trocas movem algo, sendo as outras 32 o pivô trocado consigo mesmo em trechos que já estão ordenados. Os seus 334 também ficam abaixo da referência apresentada de 384 para n·log₂n, porque o elemento central de uma sequência invertida é a sua mediana, pelo que cada divisão é uniforme.
Resposta
2.016 trocas e 2.016 comparações — os 4.032 passos no contador. E 2.016 não é um facto sobre o bubble sort: é um limite inferior para toda uma família. Qualquer algoritmo restrito a trocar elementos adjacentes — insertion sort, cocktail shaker, gnome sort, ou um que ninguém tenha escrito ainda — elimina no máximo uma inversão por troca pelo passo 2, pelo que todos eles precisam de pelo menos 2.016 trocas nesta entrada e todos eles são Ω(n²) em dados invertidos devido ao modelo em que trabalham, e não por serem desajeitados. O quicksort escapa a esse limite inferior por lhe ser permitido mover um elemento 63 posições de uma só vez: 2.016 inversões eliminadas por 32 trocas reais são 63 inversões por troca, e o passo 5 indica que isso é o máximo que qualquer troca individual nessa distância poderia ter conseguido. O painel não calcula a contagem de inversões nem o limite inferior que ela implica.
-
Percurso de aprendizagem
Contar trabalho, não segundos
Referências (1)
- Insight block 3 — quicksort as its author published it: C. A. R. Hoare, "Quicksort." The Computer Journal 5(1), 10–16, 1962. The algorithm first appeared the year before as C. A. R. Hoare, "Algorithm 64: Quicksort", Communications of the ACM 4(7), 321, 1961.