Сортировка Шелла - Lisp
Формулировка задачи:
Решение задачи: «Сортировка Шелла»
(defun gap-insertion-sort (array predicate gap) (let ((length (length array))) (if (< length 2) array (do ((i 1 (1+ i))) ((eql i length) array) (do ((x (aref array i)) (j i (- j gap))) ((or (minusp (- j gap)) (not (funcall predicate x (aref array (1- j))))) (setf (aref array j) x)) (setf (aref array j) (aref array (- j gap)))))))) (defconstant +gaps+ '(9841 3280 1093 364 121 40 13 4 1) "The best sequence of gaps, according to Donald E. Knuth.") (defun shell-sort (array predicate &optional (gaps +gaps+)) (assert (eql 1 (car (last gaps))) (gaps) "Last gap of ~w is not 1." gaps) (dolist (gap gaps array) (gap-insertion-sort array predicate gap))) > (shell-sort #(5 3 8 1 9 3 4 7) #'<) #(1 3 3 4 5 7 8 9)
Объяснение кода листинга программы
В этом коде реализована сортировка Шелла для массива чисел.
Сначала определяются две функции: gap-insertion-sort
и shell-sort
.
gap-insertion-sort
- это вспомогательная функция, которая реализует алгоритм сортировки с использованием «пробелов» (gaps). Она принимает три аргумента: массив, предикат и «пробел». Предикат используется для сравнения элементов, а «пробел» определяет, на сколько позиций смещаются элементы при каждой итерации.
Функция shell-sort
принимает массив, предикат и список «пробелов». Она сначала проверяет, что последний «пробел» равен 1, иначе выводит сообщение об ошибке. Затем она перебирает все «пробелы» из списка, начиная с первого, и для каждого из них вызывает функцию gap-insertion-sort
.
В основной части кода вызывается функция shell-sort
с аргументами (5 3 8 1 9 3 4 7)’ и
#'<)'. Результатом будет отсортированный массив: (1 3 3 4 5 7 8 9)
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д