Devo aggiungere un singolo numero intero a un elenco già ordinato, in modo che vada nel posto giusto. Il mio primo pensiero è stato qualcosa di simile
(sort (cons newelt list) #'<)
Tuttavia, dato che listè già stato ordinato, è davvero necessario solo un inserimento, il che significa che questa soluzione potrebbe essere orribilmente inadatta a seconda dell'algoritmo utilizzato da sort.
Quindi, qual è l'algoritmo che sortutilizza?
Sarebbe meglio fare qualcosa di simile al seguente?
(let ((tail list))
;; The first element is never less-than
(while (and tail (< newelt (cadr tail)))
(setq tail (cdr tail)))
(setcdr tail (cons newelt (cdr tail)))
list)
Biniziale già ordinato liste Ae Cinizialmente liste vuote. Dividi Bin due parti B1, B2di lunghezze me mo m+1e m, rispetto neweltal primo elemento di B2. Se neweltsi ≥estende Aalla sua destra con B1e si sostituisce Bcon B2, altrimenti si estende Calla sua sinistra con B2e si sostituisce Bcon B1. Dopo O(log n)tali passaggi non viene lasciato nulla B. Quindi Acontiene le cose ≤ newelte Cquelle > newelt, e la concatenazione produce l'elenco ordinato esteso. Ci scusiamo per il e-lisplinguaggio non molto simile.