Preciso adicionar um único número inteiro a uma lista que já esteja classificada, de modo que fique no lugar certo. Meu primeiro pensamento foi algo como
(sort (cons newelt list) #'<)
No entanto, dado que list
já está classificado, apenas uma inserção é realmente necessária, o que significa que esta solução pode ser terrivelmente inadequada, dependendo do algoritmo usado por sort
.
Então, qual é o algoritmo que sort
usa?
Seria melhor fazer algo como o seguinte?
(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 inicial já ordenados list
e A
e C
listas inicialmente vazias. Divida B
em duas partes B1
, B2
de comprimentos m
e m
ou m+1
e m
, compare newelt
com o primeiro elemento de B2
. Se newelt
é ≥
estender A
a sua direita com B1
e substituir B
com B2
, senão estender C
à sua esquerda com B2
e substituir B
com B1
. Após O(log n)
essas etapas, não resta nada B
. Em seguida, A
contém as coisas ≤ newelt
e C
essas > newelt
e a concatenação produz a lista classificada estendida. Desculpas por não e-lisp
gostar muito da linguagem.