Я пытаюсь реализовать быструю сортировку в CLisp, и до сих пор я могу разделить список вокруг оси. Однако, когда я пытаюсь объединить и рекурсивно отсортировать подсписки, я получаю либо переполнение стека, либо ошибку с let
, и я не уверен, что происходит не так. Вот мой код:
(defun pivot (n xs)
(list (getLesser n xs) (getGreater n xs))
)
(defun getLesser (m l)
(cond
((null l) nil)
((<= m (car l)) (getLesser m (cdr l)))
(t (cons (car l) (getLesser m (cdr l)))))
)
(defun getGreater (m l)
(cond
((null l) nil)
((> m (car l)) (getGreater m (cdr l)))
(t (cons (car l) (getGreater m (cdr l)))))
)
(defun quicksort (xs)
(cond
((null xs) nil)
(t
(let (partition (pivot (car xs) xs))
(cond
((null (car partition)) (cons (quicksort (cdr partition)) nil))
((null (cdr partition)) (cons (quicksort (car partition)) nil))
(t (append (quicksort (car partition)) (quicksort (cdr partition)))))))))
Моя идея заключалась в том, чтобы иметь локальную переменную partition
, которая представляет собой список из 2 списков, где car partition
- это список чисел, меньших, чем сводная, а cdr partition
- список чисел, больших, чем сводная. Затем, в финальной конструкции cond
, если бы не было чисел, меньших, чем пивот, я бы рекурсивно отсортировал 2-й список; если бы не было чисел, превышающих точку разворота, я бы отсортировал первый список; иначе я бы рекурсивно отсортировал оба и добавил их по порядку. Кто-нибудь может мне помочь?