J'ai besoin d'ajouter un seul entier à une liste qui est déjà triée, de telle sorte qu'elle aille au bon endroit. Ma première pensée était quelque chose comme
(sort (cons newelt list) #'<)
Cependant, étant donné qu'il list
est déjà trié, une seule insertion est vraiment nécessaire, ce qui signifie que cette solution pourrait être horriblement inappropriée en fonction de l'algorithme utilisé par sort
.
Alors, quel est l'algorithme qui sort
utilise?
Serais-je mieux de faire quelque chose comme ce qui suit?
(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
initiales déjà triées list
et A
et C
initialement vides. Diviser B
en deux parties B1
, B2
de longueurs m
et m
ou m+1
et m
, comparer newelt
au premier élément de B2
. Si newelt
est - ≥
étendre A
à sa droite avec B1
et remplacer B
avec B2
, étendre le reste C
à sa gauche avec B2
et remplacer B
par B1
. Après de O(log n)
telles étapes, rien n'est laissé B
. A
Contient ensuite les choses ≤ newelt
, et C
celles-ci > newelt
, et la concaténation produit la liste triée étendue. Toutes mes excuses pour un e-lisp
langage peu similaire.