Мне нужно добавить одно целое число в список, который уже отсортирован, так что он идет в нужном месте. Моя первая мысль была что-то вроде
(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
похожий язык.