Ich muss einer Liste, die bereits sortiert ist, eine einzelne Ganzzahl hinzufügen, damit sie an der richtigen Stelle abgelegt wird. Mein erster Unterricht war so etwas wie
(sort (cons newelt list) #'<)
Da dies list
jedoch bereits sortiert ist, wird nur eine Einfügung wirklich benötigt, was bedeutet, dass diese Lösung je nach dem von verwendeten Algorithmus fürchterlich ungeeignet sein kann sort
.
Welcher Algorithmus wird sort
verwendet?
Wäre ich besser dran, wenn ich Folgendes täte?
(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
initial sein bereits sortiert list
und A
und C
zunächst leere Listen. Split B
in zwei Teile B1
, B2
von Längen m
und m
oder m+1
und m
, zu vergleichen , newelt
um erste Element B2
. Wenn newelt
heißt ≥
verlängern A
mit seiner rechten B1
und ersetzen B
mit B2
, sonst zu verlängern , C
um seine linke mit B2
und ersetzen B
mit B1
. Nach O(log n)
solchen Schritten ist nichts mehr drin B
. Dann A
enthält die Dinge ≤ newelt
, und C
diejenigen > newelt
, und Verkettung erzeugt die erweiterte sortierte Liste. Entschuldigung für nicht sehr e-lisp
ähnliche Sprache.