;; Генерация последовательности Седжвика (defun sedgewick-sequence (n) (labels ((sedgewick-iter (k seq) (let ((next (+ (* 4 (expt 2 k)) (* 3 (expt 2 (1- k))) 1))) (if (> next n) (reverse seq) (sedgewick-iter (1+ k) (cons next seq)))))) (if (<= n 1) '(1) (sedgewick-iter 1 '(1))))) ;; Сортировка вставками с заданным шагом (defun insertion-sort-step (lst step cmp) (let ((n (length lst))) (loop for i from step below n do (let ((temp (nth i lst)) (j i)) (loop while (and (>= j step) (funcall cmp temp (nth (- j step) lst))) do (setf (nth j lst) (nth (- j step) lst)) (decf j step)) (setf (nth j lst) temp)))) lst) ;; Основная функция сортировки Шелла (defun shell-sort (lst cmp) (let ((n (length lst))) (if (<= n 1) lst (let ((steps (sedgewick-sequence n))) (shell-sort-with-steps lst steps cmp))))) ;; Сортировка с последовательностью шагов (defun shell-sort-with-steps (lst steps cmp) (if (null steps) lst (shell-sort-with-steps (insertion-sort-step lst (car steps) cmp) (cdr steps) cmp))) ;; Примеры использования ;; Сортировка списка чисел по возрастанию (let ((numbers '(5 2 8 1 9 4 0 7 3 6))) (format t "Original list: ~a~%" numbers) (let ((sorted-numbers (shell-sort (copy-list numbers) #'<))) (format t "Sorted list: ~a~%" sorted-numbers)))
Standard input is empty
Original list: (5 2 8 1 9 4 0 7 3 6) Sorted list: (0 1 2 3 4 5 6 7 8 9)
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later! Memory dump: 0x8000000000 - 0x80000bffff 0x15420f600000 - 0x15420f8e4fff 0x15420fa15000 - 0x15420fa39fff 0x15420fa3a000 - 0x15420fbacfff 0x15420fbad000 - 0x15420fbf5fff 0x15420fbf6000 - 0x15420fbf8fff 0x15420fbf9000 - 0x15420fbfbfff 0x15420fbfc000 - 0x15420fbfffff 0x15420fc00000 - 0x15420fc02fff 0x15420fc03000 - 0x15420fe01fff 0x15420fe02000 - 0x15420fe02fff 0x15420fe03000 - 0x15420fe03fff 0x15420fe80000 - 0x15420fe8ffff 0x15420fe90000 - 0x15420fec3fff 0x15420fec4000 - 0x15420fffafff 0x15420fffb000 - 0x15420fffbfff 0x15420fffc000 - 0x15420fffefff 0x15420ffff000 - 0x15420fffffff 0x154210000000 - 0x154210003fff 0x154210004000 - 0x154210203fff 0x154210204000 - 0x154210204fff 0x154210205000 - 0x154210205fff 0x15421037d000 - 0x154210380fff 0x154210381000 - 0x154210381fff 0x154210382000 - 0x154210383fff 0x154210384000 - 0x154210384fff 0x154210385000 - 0x154210385fff 0x154210386000 - 0x154210386fff 0x154210387000 - 0x154210394fff 0x154210395000 - 0x1542103a2fff 0x1542103a3000 - 0x1542103affff 0x1542103b0000 - 0x1542103b3fff 0x1542103b4000 - 0x1542103b4fff 0x1542103b5000 - 0x1542103b5fff 0x1542103b6000 - 0x1542103bbfff 0x1542103bc000 - 0x1542103bdfff 0x1542103be000 - 0x1542103befff 0x1542103bf000 - 0x1542103bffff 0x1542103c0000 - 0x1542103c0fff 0x1542103c1000 - 0x1542103eefff 0x1542103ef000 - 0x1542103fdfff 0x1542103fe000 - 0x1542104a3fff 0x1542104a4000 - 0x15421053afff 0x15421053b000 - 0x15421053bfff 0x15421053c000 - 0x15421053cfff 0x15421053d000 - 0x154210550fff 0x154210551000 - 0x154210578fff 0x154210579000 - 0x154210582fff 0x154210583000 - 0x154210584fff 0x154210585000 - 0x15421058afff 0x15421058b000 - 0x15421058dfff 0x154210590000 - 0x154210590fff 0x154210591000 - 0x154210591fff 0x154210592000 - 0x154210592fff 0x154210593000 - 0x154210593fff 0x154210594000 - 0x154210594fff 0x154210595000 - 0x15421059bfff 0x15421059c000 - 0x15421059efff 0x15421059f000 - 0x15421059ffff 0x1542105a0000 - 0x1542105c0fff 0x1542105c1000 - 0x1542105c8fff 0x1542105c9000 - 0x1542105c9fff 0x1542105ca000 - 0x1542105cafff 0x1542105cb000 - 0x1542105cbfff 0x5641ab4d3000 - 0x5641ab5c3fff 0x5641ab5c4000 - 0x5641ab6cdfff 0x5641ab6ce000 - 0x5641ab72dfff 0x5641ab72f000 - 0x5641ab75dfff 0x5641ab75e000 - 0x5641ab78efff 0x5641ab78f000 - 0x5641ab792fff 0x5641ac9b1000 - 0x5641ac9d1fff 0x7fff12296000 - 0x7fff122b6fff 0x7fff122eb000 - 0x7fff122eefff 0x7fff122ef000 - 0x7fff122f0fff