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 listjá 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 sortusa?
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)
Bser inicial já ordenados liste Ae Clistas inicialmente vazias. Divida Bem duas partes B1, B2de comprimentos me mou m+1e m, compare neweltcom o primeiro elemento de B2. Se newelté ≥estender Aa sua direita com B1e substituir Bcom B2, senão estender Cà sua esquerda com B2e substituir Bcom B1. Após O(log n)essas etapas, não resta nada B. Em seguida, Acontém as coisas ≤ newelte Cessas > newelte a concatenação produz a lista classificada estendida. Desculpas por não e-lispgostar muito da linguagem.