在方案中为quicksort编写分区

时间:2014-11-13 02:45:27

标签: scheme quicksort

我在撰写计划时遇到了很多麻烦......

我正在尝试使用scheme编写quicksort。我已经看到了大量的答案,但它们对我来说并没有任何意义,这主要是因为我根本不了解函数式编程。

我已经定义了我的支点:

(define (pivot lis)
  (car lis))

工作正常(并且很容易写...)

为了解分区功能,您有原始列表,然后将其拆分为2个新列表,一个包含大于枢轴的值,另一个包含小于或等于枢轴的值。

这就是我尝试实施它的方式:

(define (partition lis)
  (if (null? lis) '())
  (else (lambda (lis1 lis2)
          (if (< (car lis) pivot) append lis1)
          (partition (append lis2)))))

这是我得到的错误: 。 else:不允许作为表达式:( else(lambda(lis1 lis2)(if(&lt;(car lis)pivot)append lis1)(partition(append lis2)))))

我不确定如何做到这一点,关于如何使这项工作的任何想法?或者我的理由是什么?

1 个答案:

答案 0 :(得分:1)

(define (partition ls)
  (partition-aux ls (pivot ls) '() '()))

(define (parition-aux ls pivot smaller larger)
  (cond
    ((empty? ls) (list smaller larger))
    ((< (car ls) pivot)
     (parition-aux (cdr ls) pivot (cons (car ls) smaller) larger))
    (else
     (partition-aux (cdr ls) pivot smaller (cons (car ls) larger)))))

你需要定义另一个功能来完成这项工作。因为你需要另外两个参数来保存较小和较大数字的列表。这是一种方法。还有其他更短的输入方式。但我想要明确。