Мені потрібно додати одне ціле число до вже відсортованого списку таким чином, щоб воно було в потрібному місці. Перше моє враження було щось на кшталт
(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люблю мову.