所以,我正在进行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))
非常感谢任何可以提供帮助或指点我的人!
答案 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
)并将它们与彼此进行比较。
希望这有帮助!