Types 我的快速排序没有';不能使用负数(通用Lisp)

Types 我的快速排序没有';不能使用负数(通用Lisp),types,lisp,common-lisp,quicksort,negative-number,Types,Lisp,Common Lisp,Quicksort,Negative Number,该函数仅适用于正数。有时使用负数,但大多数情况下显示此错误“值-1不是无符号字节类型” 但这不起作用,我只加了-到80 '(-5 3 7 6 2 1 -4 100 5 -80 96 14 2 3 1 0 0 789 -1 3) 谢谢 修正版(随机轴添加),我知道有更好的方法,这只是教授留下的练习 (defun OrdRapido (lista inf sup) (let ((pivote (nth (random (1+ sup)) lista)) (i inf) (j sup) (au

该函数仅适用于正数。有时使用负数,但大多数情况下显示此错误“值-1不是无符号字节类型”

但这不起作用,我只加了-到80

'(-5 3 7 6 2 1 -4 100 5 -80 96 14 2 3 1 0 0 789 -1 3)
谢谢

修正版(随机轴添加),我知道有更好的方法,这只是教授留下的练习

 (defun OrdRapido (lista inf sup)
  (let ((pivote (nth (random (1+ sup)) lista)) (i inf) (j sup) (aux))
    (unless (>= inf sup)
        (loop (when (> i j) (return))
          (loop (when (<= (nth i lista) pivote) (return)) (setf i (1+ i)))
          (loop (when (>= (nth j lista) pivote) (return)) (setf j (1- j)))
          (when (<= i j)
            (setf aux (nth i lista))
            (setf (nth i lista) (nth j lista))
            (setf (nth j lista) aux)
            (setf i (1+ i))
            (setf j (1- j))))  
        (OrdRapido lista inf j)
        (OrdRapido lista i sup)) 
    lista))
(定义OrdRapido(lista inf sup)
让((第n个(随机的(1+sup))列表a))(i inf)(j sup)(aux))
(除非(>=inf sup)
(循环(当(>i j)(返回))
(循环(当(=(第n个j列表)旋转)(返回))(设置j(1-j)))

(当(您试图返回列表中不起作用的第-1个元素时。第n个元素返回列表中的第n个元素,因此(第n个0'(1 2 3))将返回1。但在代码中的某个点,它会调用(第n个-1(-5-80-4-1 0…)并发出隆隆声

关于代码的其他注意事项:

  • 将结束语放在单独的行上不是很好的lisp风格,会使代码更难阅读。lisp代码是由列表组成的,Paren与其他语言的大括号不太一样
  • 使用支持您的语言的编辑器。我建议Vim搭配Slim或Emacs搭配slime。如果您搭配slime搭配Emacs
  • 不要在你的名字中使用驼峰式大小写。所有符号在实习时都会在公共lisp中进行升格,因此'HelloThere'HelloThere'HelloThere的符号完全相同
另外,请查看quicksort,以了解如何在CommonLisp(以及许多其他语言)中进行快速排序

;;下面是一个功能版本示例。
(取消快速排序(列表和辅助(枢轴(车辆列表)))
(如有)(其余名单)
(连接“列表”
(快速排序(如果不是,则删除#’(lambda(x)(x pivot))列表)))
(列表)
如果您不习惯阅读lambdas,那么这里的代码与上面的代码相同,但是lambdas被制作成了本地函数,因此代码读起来更像英语

(defun quicksort (list &aux (pivot (car list)))
  (labels ((less-than-pivot (x) (< x pivot))
           (greater-than-pivot (x) (> x pivot))
           (equal-to-pivot (x) (= x pivot)))
    (if (rest list)
        (concatenate 'list 
                     (quicksort (remove-if-not #'less-than-pivot list))
                     (remove-if-not #'equal-to-pivot list)
                     (quicksort (remove-if-not #'greater-than-pivot list)))
        list)))
(取消快速排序(列表和辅助(枢轴(车辆列表)))
(标签((小于轴(x)(x枢轴))
(等于枢轴(x)(=x枢轴)))
(如有)(其余名单)
(连接“列表”
(快速排序(如果不是,则删除#'小于轴列表))
(如果不是#等轴列表,则删除)
(快速排序(如果不是,则删除#“大于轴列表”))
(列表)

在我看来,第二个版本有点不太整洁。在这两个例子中,你都可以看到递归方法如何让你思考如何只做一步,然后通过调用自己,你将解决方案应用于一步,以获得整个问题的解决方案。你试图返回列表中不起作用的第-1个元素。nth返回列表的第n个元素,因此(nth0’(1233))将返回1。但在代码中的某个点,它调用(nth-1(-5-80-4-1000…)和boom

关于代码的其他注意事项:

  • 将结束语放在单独的行上不是很好的lisp风格,会使代码更难阅读。lisp代码是由列表组成的,Paren与其他语言的大括号不太一样
  • 使用支持您的语言的编辑器。我建议Vim搭配Slim或Emacs搭配slime。如果您搭配slime搭配Emacs
  • 不要在你的名字中使用驼峰式大小写。所有符号在实习时都会在公共lisp中进行升格,因此'HelloThere'HelloThere'HelloThere的符号完全相同
另外,请查看quicksort,以了解如何在CommonLisp(以及许多其他语言)中进行快速排序

;;下面是一个功能版本示例。
(取消快速排序(列表和辅助(枢轴(车辆列表)))
(如有)(其余名单)
(连接“列表”
(快速排序(如果不是,则删除#’(lambda(x)(x pivot))列表)))
(列表)
如果您不习惯阅读lambdas,那么这里的代码与上面的代码相同,但是lambdas被制作成了本地函数,因此代码读起来更像英语

(defun quicksort (list &aux (pivot (car list)))
  (labels ((less-than-pivot (x) (< x pivot))
           (greater-than-pivot (x) (> x pivot))
           (equal-to-pivot (x) (= x pivot)))
    (if (rest list)
        (concatenate 'list 
                     (quicksort (remove-if-not #'less-than-pivot list))
                     (remove-if-not #'equal-to-pivot list)
                     (quicksort (remove-if-not #'greater-than-pivot list)))
        list)))
(取消快速排序(列表和辅助(枢轴(车辆列表)))
(标签((小于轴(x)(x枢轴))
(等于枢轴(x)(=x枢轴)))
(如有)(其余名单)
(连接“列表”
(快速排序(如果不是,则删除#'小于轴列表))
(如果不是#等轴列表,则删除)
(快速排序(如果不是,则删除#“大于轴列表”))
(列表)

在我看来,第二个版本有点不太整洁。在这两个例子中,你都可以看到递归方法如何让你思考如何只做一步,然后通过调用自己,你将解决方案应用于一步,以获得整个问题的解决方案,因为你最初的想法是使用
循环
这就是你可能会做的:

(defun quicksort (list)
  (if (cdr list)
      (loop :with pivot := (car list)
         :for element :in list
         :if (< element pivot) :collect element :into a
         :else :if (= element pivot) :collect element :into b
         :else :collect element :into c
         :finally (return (nconc (quicksort a) b (quicksort c)))) list)) 
(取消快速排序(列表)
(如果(cdr列表)
(循环:带枢轴:=(车辆列表)
:对于列表中的元素
:if(
仅仅是因为您最初的想法是使用
循环来执行此操作。以下是您可能的操作方式:

(defun quicksort (list)
  (if (cdr list)
      (loop :with pivot := (car list)
         :for element :in list
         :if (< element pivot) :collect element :into a
         :else :if (= element pivot) :collect element :into b
         :else :collect element :into c
         :finally (return (nconc (quicksort a) b (quicksort c)))) list)) 
(取消快速排序(列表)
(如果(cdr列表)
(循环:带枢轴:=(车辆列表)
:对于列表中的元素
:if((defun quicksort (list)
  (if (cdr list)
      (loop :with pivot := (car list)
         :for element :in list
         :if (< element pivot) :collect element :into a
         :else :if (= element pivot) :collect element :into b
         :else :collect element :into c
         :finally (return (nconc (quicksort a) b (quicksort c)))) list)) 
(defun simple-list-partition (list end)
  "Reorder list until end such that all values less than the first value in the
  list are placed left of it and all greater placed to its right; return the new
  index of the first value and the tail of the list starting with that value as
  multiple values."
  (loop for walk-cons on (cdr list)
        for walk-value = (car walk-cons)
        for walk-index from 1
        with pivot-value = (car list)
        with rotate-cons = list
        with rotate-index = 0
        while (<= walk-index end)
        when (< walk-value pivot-value)
        do (progn (setq rotate-cons (cdr rotate-cons)
                        rotate-index (+ 1 rotate-index))
                  (rotatef (car rotate-cons) (car walk-cons)))
        finally (progn (rotatef (car list) (car rotate-cons))
                       (return (values rotate-index rotate-cons)))))

(defun quicksort (list)
  "Quicksort for lists."
  (labels ((quicksort% (l  max)
             (when (and (plusp max) (cdr l))
               (multiple-value-bind (index tail)
                   (simple-list-partition l max)
                 (quicksort% l (1- index))
                 (quicksort% (cdr tail) (- max index 1))))))
    (quicksort% list (1- (length list)))
    list))