Zaten sıralanmış olan bir listeye doğru bir yere gelmesi için tek bir tamsayı eklemem gerekiyor. İlk düşündüğüm şey gibiydi
(sort (cons newelt list) #'<)
Ancak, list
halihazırda sıralandığı göz önüne alındığında , yalnızca bir ekleme gerçekten gereklidir, bu, bu çözümün kullandığı algoritmaya bağlı olarak korkunç derecede uygun olabileceği anlamına gelir sort
.
Peki, kullanılan algoritma hangisi sort
?
Aşağıdaki gibi bir şey yaparak daha iyi olur muyum?
(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
zaten sıralanmış başlangıç olması list
ve A
ve C
başlangıçta boş listeleri. Bölünmüş B
iki parçalı olarak B1
, B2
uzunlukları m
ve m
ya m+1
ve m
, karşılaştırma newelt
birinci elemana B2
. Eğer newelt
is ≥
uzatmak A
ile sağa B1
ve değiştirme B
ile B2
, başka uzatmak C
ile sola B2
ve değiştirme B
ile B1
. O(log n)
Bu adımlardan sonra hiçbir şey kalmaz B
. Sonra A
şeyi içermesi ≤ newelt
ve C
bu > newelt
ve birleştirme genişletilmiş sıralı liste üretir. Dilden e-lisp
hoşlanmadığım için özür dilerim .