重新排序子列表快速排序

时间:2010-12-13 22:52:47

标签: lisp

我在Lisp中做快速排序时遇到了麻烦。

我的目标是:

如果列表包含0或1个元素,则它已经排序。否则按如下方式排序:首先获取pivot,这是列表的第一个元素。现在浏览列表的其余部分(使用DOLIST),将每个元素与pivot进行比较。如果元素小于或等于pivot,则将其放在left-sublist中,否则将其放在right-sublist中(使用CONS或APPEND)。然后调用Qsort对左子列表和右子列表进行排序。最后,将left-sublist,pivot和right-sublist组合成一个排序列表。

这是我的代码:

(defun qsort (x)
  (if (>= 1 (length x))
      (format t"~%~s is already sorted" x)

      ((let (pivot (first x))
         (dolist (i x )
           (if (>= pivot (nth i x))
               (list y (nth i))
               (list z (nth i))))
         (appned y z)))))

然而我似乎已经碰到了

  

形成不良的lambda :( LET(PIVOT(FIRST X))(DOLIST(IX PIVOT)(IF(> = PIVOT(NTH IX))(LIST PIVOT(NTH I))(LIST PIVOT(NTH I)) )))

来自编译器。

我希望你能提供帮助。谢谢。

1 个答案:

答案 0 :(得分:1)

为什么LET周围有两层括号?

为什么绑定周围的LET内部缺少一层圆括号?

你为什么打电话(第n次)?为什么选择我?

为什么用一个参数调用NTH,需要两个?

APPNED有什么功能?没有该名称的功能。

(> = x 1)是(plusp x)

以及更多......