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 listest 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 sortutilise?
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)
          Binitiales déjà triées listet Aet Cinitialement vides. Diviser Ben deux parties B1, B2de longueurs met mou m+1et m, comparer neweltau premier élément de B2. Si neweltest - ≥étendre Aà sa droite avec B1et remplacer Bavec B2, étendre le reste Cà sa gauche avec B2et remplacer Bpar B1. Après de O(log n)telles étapes, rien n'est laissé B. AContient ensuite les choses ≤ newelt, et Ccelles-ci > newelt, et la concaténation produit la liste triée étendue. Toutes mes excuses pour un e-lisplangage peu similaire.