Шейкерная сортировка в Lisp
Формулировка задачи:
Решение задачи: «Шейкерная сортировка в Lisp»
- ;; Последний элемент списка
- (defun last-el (lst) (car (last lst)))
- ;; Предпоследний элемент списка
- (defun plast-el (lst) (car (last (butlast lst))))
- ;; Проход вправо
- (defun step-r (lst)
- (cond ((null (cdr lst)) lst)
- ((> (car lst) (cadr lst)) (cons (cadr lst) (step-r (cons (car lst) (cddr lst)))))
- (t (cons (car lst) (step-r (cdr lst))))))
- ;; Проход влево
- (defun step-l (lst)
- (cond ((null (cdr lst)) lst)
- ((> (plast-el lst) (last-el lst)) (append (step-l (append (butlast (butlast lst)) (last lst))) (list (plast-el lst))))
- (t (append (step-l (butlast lst)) (last lst)))))
- ;; Шейкерная сортировка
- (defun cocktail (lst &optional (n (length lst)))
- (cond ((<= n 1) lst)
- (t (let* ((l1 (step-l lst))
- (l2 (step-r l1)))
- (append (list (car l2)) (cocktail (cdr (butlast l2)) (- n 2)) (last l2))))))
- (cocktail '(1 8 2 1 4 0 7 2))
- ==> (0 1 1 2 2 4 7 8)
Объяснение кода листинга программы
В этом коде реализована функция cocktail
, которая выполняет шикерную сортировку списка. Эта функция принимает список и опциональный аргумент n
, который указывает количество итераций сортировки. Если n
не указан, то он вычисляется как длина списка.
Функция step-r
выполняет проход по списку вправо. Если список пуст или его первый элемент больше второго, то вызывается рекурсия с новым списком, состоящим из второго элемента исходного списка. В противном случае, первый элемент добавляется в новый список, и выполняется рекурсивный вызов для оставшейся части списка.
Функция step-l
выполняет проход по списку влево. Если список пуст или его последний элемент меньше предпоследнего, то вызывается рекурсия с новым списком, состоящим из предпоследнего элемента исходного списка. В противном случае, новый список формируется из оставшейся части списка, а последний элемент добавляется в конец.
Функция last-el
возвращает последний элемент списка.
Функция plast-el
возвращает предпоследний элемент списка.
В функции cocktail
выполняется рекурсивный вызов step-l
и step-r
, пока не будет достигнуто условие выхода из рекурсии, когда количество итераций равно n
. Результатом работы функции является отсортированный список.
Пример использования функции cocktail
с аргументом '(1 8 2 1 4 0 7 2)'
возвращает отсортированный список (0 1 1 2 2 4 7 8)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д