Dimensión pedagógica
Debido a su simplicidad, el método de partición de Lomuto podría ser más fácil de implementar. Hay una bonita anécdota en la Perla de programación de Jon Bentley sobre la clasificación:
“La mayoría de las discusiones sobre Quicksort usan un esquema de partición basado en dos índices aproximados [...] [es decir, el de Hoare]. Aunque la idea básica de ese esquema es directa, siempre he encontrado los detalles difíciles: una vez pasé la mayor parte de dos días persiguiendo un error que se ocultaba en un breve ciclo de partición. Un lector de un borrador preliminar se quejó de que el método estándar de dos índices es, de hecho, más simple que el de Lomuto y esbozó un código para hacer su punto; Dejé de buscar después de encontrar dos errores ".
Dimensión de rendimiento
Para un uso práctico, la facilidad de implementación podría ser sacrificada en aras de la eficiencia. Sobre una base teórica, podemos determinar el número de comparaciones de elementos y swaps para comparar el rendimiento. Además, el tiempo real de ejecución estará influenciado por otros factores, como el rendimiento del almacenamiento en caché y las predicciones erróneas de las ramas.
Como se muestra a continuación, los algoritmos se comportan de manera muy similar en permutaciones aleatorias, excepto por el número de intercambios . ¡Allí Lomuto necesita tres veces más que Hoare!
Numero de comparaciones
n−1n
Número de intercambios
El número de intercambios es aleatorio para ambos algoritmos, dependiendo de los elementos en la matriz. Si asumimos permutaciones aleatorias , es decir, todos los elementos son distintos y cada permutación de los elementos es igualmente probable, podemos analizar el número esperado de intercambios.
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
Finalmente, promediamos nuevamente sobre todos los valores de pivote para obtener el número total esperado de swaps para la partición de Hoare:
1n∑x=1n(n−x)(x−1)n−1=n6−13.
(Se puede encontrar una descripción más detallada en mi tesis de maestría , página 29).
Patrón de acceso a memoria
Ambos algoritmos usan dos punteros en la matriz que lo escanean secuencialmente . Por lo tanto, ambos se comportan con un almacenamiento en memoria caché casi óptimo.
Elementos iguales y listas ya ordenadas
Como ya mencionó Wandering Logic, el rendimiento de los algoritmos difiere más drásticamente para las listas que no son permutaciones aleatorias.
n/2
0ijO(nlogn)
0A[j] <= x
i=nΘ(n2)
Conclusión
El método de Lomuto es simple y más fácil de implementar, pero no debe usarse para implementar un método de clasificación de bibliotecas.
A[i+1] <= x
. En una matriz ordenada (y dados los pivotes razonablemente elegidos) Hoare casi no cambia y Lomuto hace una tonelada (una vez que j se vuelve lo suficientemente pequeña, entonces todo lo demásA[j] <= x
). ¿Qué me estoy perdiendo?