该函数仅适用于正数。有时会使用负数,但大多数时候会显示此错误“值 -1 不是 UNSIGNED-BYTE 类型”。
(defun OrdRapido (lista inf sup)
(let ((pivote (nth sup lista)) (i (1- inf)) (j sup) (aux))
(unless (>= inf sup)
(loop (when (>= i j) (return))
(loop (setf i (1+ i)) (when (>= (nth i lista) pivote) (return)))
(loop (setf j (1- j)) (when (<= (nth j lista) pivote) (return)))
(when (< i j)
(setf aux (nth i lista))
(setf (nth i lista) (nth j lista))
(setf (nth j lista) aux)))
(setf aux (nth i lista))
(setf (nth i lista) (nth sup lista))
(setf (nth sup lista) aux)
(OrdRapido lista inf (1- i))
(OrdRapido lista (1+ i) sup))
lista))
例如:
(setq lista2 '(-5 3 7 6 2 1 -4 100 5 80 96 14 2 3 1 0 0 789 -1 3))
(OrdRapido lista2 0 (1- (length lista2)))
CL-USER>
(-5 3 7 6 2 1 -4 100 5 80 96 14 2 3 1 0 0 789 -1 3)
CL-USER>
(-5 -4 -1 0 0 1 1 2 2 3 3 3 5 6 7 14 80 96 100 789)
但不适用于此,我只将 - 添加到 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))