Por lo que saben los mejores algoritmos de ordenación escritos en Prolog directamente, sin hacer referencia a ningún muebles empotrados especiales utilizan algún tipo de ordenamiento por mezcla.
Una optimización frecuente es comenzar a fusionar no con listas de longitud 1 pero con segmentos ya ordenados.
Es decir, para ordenar la lista [4,5,3,6,2,7,1,2]
, las listas [4,5]
, [3,6]
, [2,7]
, [1,2]
se fusionarían.
Esto se puede optimizar aún más ensamblando las listas clasificadas no solo en sentido ascendente, sino también en la otra dirección. Para el ejemplo anterior, esto significaría que el segmento según se ensambla como sigue:
[4,5|_]
[3,4,5|_]
[3,4,5,6|_]
...
Nótese que en Prolog es sencillo para extender una lista tanto en el comienzo y al final.
Por lo tanto, tenemos que fusionar [1,2,3,4,5,6,7]
y [2]
solamente.
Un sistema actual que utiliza la implementación original (~ 1984) de Richard O'Keefe es Ciao-Prolog en ciao-1.15/lib/sort.pl
.
Solo una nota: ese predicado (usando el pivoting/4 implementado en su enlace) realiza una ordenación descendente, tiene que invertir los operadores de comparación de pivoting/4 para realizar una ordenación ascendente. – gusbro