Сортировка Шелла - Lisp

Узнай цену своей работы

Формулировка задачи:

Добрый день, помогите плиз реализовать сортировку Шелла методом Кнута

Решение задачи: «Сортировка Шелла»

textual
Листинг программы
  1. (defun gap-insertion-sort (array predicate gap)
  2.   (let ((length (length array)))
  3.     (if (< length 2) array
  4.       (do ((i 1 (1+ i))) ((eql i length) array)
  5.         (do ((x (aref array i))
  6.              (j i (- j gap)))
  7.             ((or (minusp (- j gap))
  8.                  (not (funcall predicate x (aref array (1- j)))))
  9.              (setf (aref array j) x))
  10.           (setf (aref array j) (aref array (- j gap))))))))
  11.  
  12. (defconstant +gaps+
  13.   '(9841 3280 1093 364 121 40 13 4 1)
  14.   "The best sequence of gaps, according to Donald E. Knuth.")
  15.  
  16. (defun shell-sort (array predicate &optional (gaps +gaps+))
  17.   (assert (eql 1 (car (last gaps))) (gaps)
  18.     "Last gap of ~w is not 1." gaps)
  19.   (dolist (gap gaps array)
  20.     (gap-insertion-sort array predicate gap)))
  21.  
  22. > (shell-sort #(5 3 8 1 9 3 4 7) #'<)
  23. #(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).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.182 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут