Tôi cần thêm một số nguyên duy nhất vào danh sách đã được sắp xếp, sao cho nó đi đúng chỗ. Suy nghĩ đầu tiên của tôi là một cái gì đó như
(sort (cons newelt list) #'<)
Tuy nhiên, do list
đã được sắp xếp, chỉ cần một lần chèn, điều đó có nghĩa là giải pháp này có thể không phù hợp khủng khiếp tùy thuộc vào thuật toán được sử dụng sort
.
Vậy, thuật toán sort
sử dụng là gì?
Tôi sẽ tốt hơn nếu làm điều gì đó như sau?
(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
được ban đầu đã được sắp xếp list
và A
và C
danh sách ban đầu rỗng. Chia làm B
hai phần B1
, B2
độ dài m
và m
hoặc m+1
, và m
so sánh newelt
với phần tử đầu tiên của B2
. Nếu newelt
được ≥
mở rộng A
sang bên phải bằng B1
và thay thế B
bằng B2
, thì mở rộng C
sang bên trái bằng B2
và thay thế B
bằng B1
. Sau O(log n)
các bước như vậy, không có gì còn lại trong B
. Sau đó A
chứa những thứ ≤ newelt
, và C
những thứ đó > newelt
, và ghép nối tạo ra danh sách được sắp xếp mở rộng. Xin lỗi vì không e-lisp
thích ngôn ngữ lắm.