在方案中对列表进行排序

时间:2010-11-23 22:25:04

标签: scheme

如何编写一个将列表按递增顺序返回的排序算法。

例如:'(1 3 5 2 9)返回'(1 2 3 5 9)

2 个答案:

答案 0 :(得分:3)

大多数Scheme实现都附带了一个对列表进行排序的过程。如果您的实现没有提供,那么在您的实现上滚动一个并不困难。以下是快速排序算法的实现:

> (define (qsort e)
  (if (or (null? e) (<= (length e) 1)) e
      (let loop ((left null) (right null)
                   (pivot (car e)) (rest (cdr e)))
            (if (null? rest)
                (append (append (qsort left) (list pivot)) (qsort right))
               (if (<= (car rest) pivot)
                    (loop (append left (list (car rest))) right pivot (cdr rest))
                    (loop left (append right (list (car rest))) pivot (cdr rest)))))))
> (qsort  '(1 3 5 2 9))
=> (1 2 3 5 9)

答案 1 :(得分:1)

SRFI 95提供了一个排序库。许多Scheme实现也内置了排序库,但并非所有这些都符合SRFI 95接口。


如果你需要编写自己的实现(比如作业),那么你应该使用一种标准的排序算法,比如mergesort或quicksort。但是,这两种算法都是基于矢量的算法,因此您需要将列表复制到矢量,对其进行排序,然后将其复制回列表。 (您可能会发现SRFI 43对向量操作操作很有用,尤其是vector-swap!用于交换向量的两个元素。)

可能存在适合直接对链接列表进行排序的算法。我不是他们的忠诚,所以我不会再对他们发表评论。