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