Мне нужно добавить одно целое число в список, который уже отсортирован, так что он идет в нужном месте. Моя первая мысль была что-то вроде
(sort (cons newelt list) #'<)
Однако, учитывая, что listэто уже отсортировано, действительно требуется только одна вставка, что означает, что это решение может быть ужасно непригодным в зависимости от используемого алгоритма sort.
Итак, какой алгоритм sortиспользует?
Буду ли я лучше делать что-то вроде следующего?
(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будут изначально уже отсортированные listи Aи Cизначально пустые списки. Разделите Bна две части B1, B2длины mи mили m+1и m, сравните neweltс первым элементом B2. Если neweltэто ≥расширение Aвправо с помощью B1и заменить Bс B2, в противном случае расширить Cего слева с B2и заменить Bна B1. После O(log n)таких шагов ничего не осталось B. Затем Aсодержит вещи ≤ newelt, и Cте > newelt, и конкатенация создает расширенный отсортированный список. Извиняюсь за не очень e-lispпохожий язык.