sorting - lisp 中的非破坏性排序?

标签 sorting lisp

我的任务是创建一个程序,在其中我需要一个函数来返回一个排序列表(按字母顺序)。但是,我无法使用和“非功能性”函数,例如“set、setq”等……这包括内置的排序函数(因为它是破坏性的)。所以,我想知道是否有一种方法可以在 lisp 中构建非破坏性排序?

最佳答案

最简单的方法是在排序前复制一份:

(sort (copy-seq input) predicate)

或者你自己写一个排序函数,例如快速排序:

(defun qsort (input predicate)
  (if input
    (let* ((pivot (first input))
           (rest (rest input))
           (lesser (remove-if-not #'(lambda (x)
                                      (funcall predicate x pivot))
                                  rest))
           (greater (remove-if-not #'(lambda (x)
                                       (not (funcall predicate x pivot)))
                                   rest)))
      (append (qsort lesser predicate)
              (list pivot)
              (qsort greater predicate)))
    nil))

(Demo)

请注意,可以对其进行优化以检测列表中已排序的剩余部分,从而在未排序列表和已排序列表之间实现结构共享。

关于sorting - lisp 中的非破坏性排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34032558/

相关文章:

matlab - 去除字符串中重复的相邻字符

list - 如何在 Common Lisp 中创建等价函数?

clojure - Clojure 中的 caddr

LISP - 小数点后的数字

algorithm - 显示经度/纬度点的子集?

java - 初始化的数组是否保留其顺序?

Java 对并行数组进行排序

lisp - Slime:frame-source-location 未实现/我的 sldb Backtrace 输出是否正常?

scheme - 二叉树插入节点程序未按预期工作(方案)

python - 按字母顺序对元组列表进行排序(区分大小写)