在lisp中进行非破坏性排序?

时间:2015-12-01 23:58:21

标签: sorting lisp

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

2 个答案:

答案 0 :(得分:4)

最简单的方法是在排序前制作副本:

(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)

请注意,可以对此进行优化以检测已排序的列表的休止符,从而在未排序和排序列表之间实现结构共享。

答案 1 :(得分:0)

如果你的破坏性排序做了像交换两个相邻元素的东西,这两个元素被你完整保留的元素包围,那么一种非破坏性的方法是创建一个新的列表,由被交换的那两个元素组成,被其他元素包围。然后使用该新列表作为后续排序操作的基础。

破坏性地,您的工作清单从头到尾是相同的,您可以通过替换一个"地点"中的值来修改它。在另一个"地方"。非破坏性地,在每一步创建一个新列表,成为工作列表。

我会把实施留给你。