Scheme - 排序列表列表

时间:2015-04-15 05:24:53

标签: list sorting scheme

所以,我正在进行Scheme(MIT Scheme)的排序。我已经弄清楚如何对基本的整数列表进行排序,但是我似乎无法弄清楚如何对列表进行排序。这是通过选择排序对整数列表进行排序的代码:

(define sortdata
    (lambda (lst min)
        (cond ((null? lst) min) ;null list, return current
        ((< (car lst) min) (sortdata (cdr lst) (car lst))) ;compare with head of list 
        (else (sortdata (cdr lst) min))
        )
    )
)

我不熟悉计划,因为我刚刚开始使用它。我没有按照这样的列表排序:(4 8 9 2 6 15 3),而是尝试对列表列表进行排序,但只有一个字段对子列表进行排序(本例中为年龄)。例如:((&#34; bob&#34; 17)(&#34; mary&#34; 14))[假设第一个字段是名称,第二个字段是年龄。]

编辑:因此,排序后的列表将如下所示:((&#34; mary&#34; 14)(&#34; bob&#34; 17))

非常感谢任何可以提供帮助或指点我的人!

2 个答案:

答案 0 :(得分:1)

简介

搜索的基本要素是:

  • :记录集合
  • 记录:字段集合
  • 字段:感兴趣的值。

为您的记录制作语言

(define name car)
(define grade cadr)

;; record record -> record
(define (return-record-with-greater-name record1 record2)
  (if (name>? record1 record2)
      record1
      record2))

(define name>?
  (make-record-compare-function string> name))

制作比较记录的语言

;;; This is a partial implementation

;; [any? any? -> boolean] [listof any? -> any?] -> [listof any? -> any?]
(define (make-record-compare-function predicate field)
  (lambda (record1 record2)
    (predicate (field record1) (field record2))))

制作搜索表格的语言

;;; This is a partial implementation

;; [any? any? -> any?] -> [listof any? -> any?]
(define (make-table-search comparator)
  (define  (inner table best-match)
    (if (null? table)
    best-match
    (inner (cdr table)
           (comparator best-match
               (car table)))))
  (lambda (table)
    (inner (cdr table)
           (car table))))

用法

racket> (define record1 (list "mary" 14))

racket> (define record3 (list "Ben" -42))
racket> (define record2 (list "bob" 17))
racket> (define sort-by-name
                 (make-table-search return-record-with-greater-name))
racket> (sort-by-name (list record3 record1 record2))
'("mary" 14)

答案 1 :(得分:0)

由于您使用的是比较排序算法,因此排序除整数之外的其他内容相当容易。基本上,您需要做的是参数化比较器。在您当前的示例中,这是函数<,但这可以是任何东西!

注意您的代码不起作用,但您几乎就在那里。因此,我将保留原样并告诉您如何做到这一点。

(define sortdata
    (lambda (lst min comparer)
        (cond ((null? lst) min) ;null list, return current
        ((comparer (car lst) min) (sortdata (cdr lst) (car lst))) ;compare with head of list 
        (else (sortdata (cdr lst) min)))))

在这种情况下,您的比较器可能是:

(lambda (x y) (> (cadr x) (cadr y)))

这个lambda将取每个人的年龄(cadr)并将它们与彼此进行比较。

希望这有帮助!