이미 정렬 된 목록에 단일 정수를 추가해야 올바른 위치로 이동합니다. 내 첫 강인은
(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)
1
이진 힙 (예 : heap.el )을 사용하면 코드에서 자주 작동합니다.
—
lunaryorn
하자
—
jfbu
B
이미 정렬 초기 수 list
와 A
그리고 C
처음에 빈 목록. 분할 B
두 부분으로 B1
, B2
길이 m
와 m
나 m+1
하고는 m
, 비교 newelt
의 첫 번째 요소 B2
. 경우 newelt
IS는 ≥
확장 A
과 오른쪽에 B1
와 교체 B
로 B2
, 다른 확장 C
과 그 왼쪽 B2
과 교체 B
와 함께 B1
. O(log n)
이러한 단계 후에 는 아무것도 남지 않습니다 B
. 그런 다음 A
사물 ≤ newelt
과 C
그 사물을 포함 > newelt
하고 연결하면 확장 정렬 목록이 생성됩니다. e-lisp
언어가 그리 좋지 않은 것에 대한 사과 .