Per quanto ne so i migliori algoritmi di ordinamento scritti in Prolog direttamente, senza riferimento ad alcun speciali built-in utilizzano una qualche forma di merge sort.
Un'ottimizzazione frequente consiste nell'avviare l'unione non con gli elenchi di lunghezza 1 ma con segmenti già ordinati.
Cioè, per ordinare l'elenco [4,5,3,6,2,7,1,2]
, le liste [4,5]
, [3,6]
, [2,7]
, [1,2]
sarebbero fusi.
Questo può essere ulteriormente ottimizzato assemblando liste ordinate non solo in direzione ascendente, ma anche nell'altra direzione. Per l'esempio di sopra di questo significherebbe che il segmento ordinato è assemblato come segue:
[4,5|_]
[3,4,5|_]
[3,4,5,6|_]
...
Si noti che in Prolog è semplice per estendere la lista sia all'inizio e alla fine.
Pertanto, dobbiamo unire solo [1,2,3,4,5,6,7]
e [2]
.
Un sistema corrente che utilizza l'implementazione originale (~ 1984) di Richard O'Keefe è Ciao-Prolog in ciao-1.15/lib/sort.pl
.
Solo una nota: tale predicato (utilizzando il pivoting/4 implementato nel collegamento) esegue un ordinamento discendente, è necessario invertire gli operatori di confronto di pivoting/4 per eseguire un ordinamento crescente. – gusbro