Necesito agregar un solo entero a una lista que ya está ordenada, de modo que vaya en el lugar correcto. Mi primer pensamiento fue algo como
(sort (cons newelt list) #'<)
Sin embargo, dado que list
ya está ordenado, solo se necesita una inserción, lo que significa que esta solución podría ser terriblemente inadecuada dependiendo del algoritmo utilizado sort
.
Entonces, ¿ cuál es el algoritmo que sort
usa?
¿Sería mejor hacer algo como lo siguiente?
(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
ser ordenados inicial ya list
e A
y C
listas inicialmente vacías. Dividir B
en dos partes B1
, B2
de longitudes m
y m
o m+1
y m
, comparar newelt
con el primer elemento de B2
. Si newelt
se ≥
extiende A
a la derecha con B1
y reemplaza B
con B2
, de lo contrario, se extiende C
a la izquierda con B2
y reemplaza B
con B1
. Después de O(log n)
tales pasos no queda nada adentro B
. Luego A
contiene las cosas ≤ newelt
, y C
esas > newelt
, y la concatenación produce la lista ordenada extendida. Disculpas por el e-lisp
lenguaje no muy parecido.