根据Scheme中的第二个元素对对列表进行排序

时间:2013-11-13 18:09:12

标签: list sorting scheme

根据每对的第二个元素,有人可以给我一些关于如何编写代码以按递增顺序对对象列表进行排序的建议吗?我没有你的例子,但这似乎是一个简单的想象。

1 个答案:

答案 0 :(得分:1)

让我们尝试编写一个mergesort。

(define (mgsort ls cmp)
  (cond
    ((or (null? ls) (null? (cdr ls)))
       ls)
    ; right? ... then,
    (else 
      (split ls '() '() cmp))))

处理列表的最基本工具是结构递归:

(define (split ls a b cmp)
  (cond 
    ((null? ls) 
       (merge (mgsort a cmp) (mgsort b cmp) cmp))
    (else
       (split (cdr ls) b (cons (car ls) a) cmp))))

现在剩下的只是编写merge - 一个将合并的函数,如“压缩”,它的两个参数是排序列表,因此结果也是一个排序列表。

(define (merge a b cmp)
  (cond 
    ((null? a) b)
    ((null? b) ....)
    ((cmp (car a) (car b))   ; right?
       (cons   
          ... ;; what? ... with what??
          (merge (cdr a) ......)))
    (else
       (cons
          ... 
          (merge a ......)))))

测试:

(mgsort (list 3 1 5 4 6 2 3) <)
;Value 12: (1 2 3 3 4 5 6)

(mgsort (list (cons 3 1) (cons 4 5) (cons 6 2)) (lambda(a b) (< (cdr a) (cdr b))))
;Value 13: ((3 . 1) (6 . 2) (4 . 5))

比照how would one merge two strings that are ordered alphabetically in lisp using recursion用于有效的自顶向下合并函数(虽然在Common Lisp中,名义上用于字符串,但它确实适用于里面的列表),尾递归模数缺点优化技术的副手实现。