如何编写一个将列表按递增顺序返回的排序算法。
例如:'(1 3 5 2 9)
返回'(1 2 3 5 9)
答案 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!
用于交换向量的两个元素。)
可能存在适合直接对链接列表进行排序的算法。我不是他们的忠诚,所以我不会再对他们发表评论。