Dimensão Pedagógica
Devido à sua simplicidade, o método de particionamento do Lomuto pode ser mais fácil de implementar. Há uma boa anedota em Programming Pearl, de Jon Bentley, sobre Classificação:
“A maioria das discussões sobre o Quicksort usa um esquema de particionamento baseado em dois índices que se aproximam [...] [isto é, de Hoare]. Embora a idéia básica desse esquema seja direta, sempre achei os detalhes complicados - uma vez passei a maior parte de dois dias perseguindo um bug escondido em um curto loop de particionamento. Um leitor de um rascunho preliminar reclamou que o método padrão de dois índices é de fato mais simples que o de Lomuto e esboçou algum código para expressar sua opinião; Parei de cuidar e encontrei dois insetos.
Dimensão de desempenho
Para uso prático, a facilidade de implementação pode ser sacrificada em prol da eficiência. Em uma base teórica, podemos determinar o número de comparações e swaps de elementos para comparar o desempenho. Além disso, o tempo de execução real será influenciado por outros fatores, como desempenho do cache e previsões incorretas de ramificações.
Como mostrado abaixo, os algoritmos se comportam de maneira muito semelhante em permutações aleatórias, exceto pelo número de swaps . Lá, Lomuto precisa de três vezes mais que Hoare!
Número de comparações
n−1n
Número de Swaps
O número de trocas é aleatório para os dois algoritmos, dependendo dos elementos na matriz. Se assumirmos permutações aleatórias , ou seja, todos os elementos são distintos e toda permutação dos elementos é igualmente provável, podemos analisar o número esperado de swaps.
1,…,n
Método de Lomuto
jA[j]x1,…,nx−1xx−1x
{1,…,n}1n
1n∑x=1n(x−1)=n2−12.
n
Método de Hoare
x
ijxij
x
Hyp(n−1,n−x,x−1)n−xx−1(n−x)(x−1)/(n−1)x
Por fim, calculamos a média novamente de todos os valores de pivô para obter o número geral esperado de swaps para o particionamento de Hoare:
1n∑x=1n(n−x)(x−1)n−1=n6−13.
(Uma descrição mais detalhada pode ser encontrada na minha tese de mestrado , página 29.)
Padrão de acesso à memória
Ambos os algoritmos usam dois ponteiros na matriz que a varrem sequencialmente . Portanto, ambos se comportam em cache wrt quase ideal.
Elementos iguais e listas já ordenadas
Como já mencionado pela Wandering Logic, o desempenho dos algoritmos difere drasticamente para listas que não são permutações aleatórias.
n/2
0ijO(nlogn)
0A[j] <= x
i=nΘ(n2)
Conclusão
O método do Lomuto é simples e fácil de implementar, mas não deve ser usado para implementar um método de classificação de bibliotecas.
A[i+1] <= x
. Em uma matriz classificada (e tendo em vista os pivôs razoavelmente escolhidos), Hoare quase não troca e Lomuto faz uma tonelada (uma vez que j fica pequeno o suficiente, então todosA[j] <= x
). O que estou perdendo?