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 sort
utilizza?
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)
B
iniziale già ordinato list
e A
e C
inizialmente liste vuote. Dividi B
in due parti B1
, B2
di lunghezze m
e m
o m+1
e m
, rispetto newelt
al primo elemento di B2
. Se newelt
si ≥
estende A
alla sua destra con B1
e si sostituisce B
con B2
, altrimenti si estende C
alla sua sinistra con B2
e si sostituisce B
con B1
. Dopo O(log n)
tali passaggi non viene lasciato nulla B
. Quindi A
contiene le cose ≤ newelt
e C
quelle > newelt
, e la concatenazione produce l'elenco ordinato esteso. Ci scusiamo per il e-lisp
linguaggio non molto simile.