List 根据Scheme中的第二个元素对成对列表进行排序
有没有人能给我一些建议,告诉我如何编写代码,根据每一对的第二个元素按递增顺序对一组对进行排序?我没有一个例子给你,但这似乎是一个简单的事情想象 让我们试着写一个合并排序List 根据Scheme中的第二个元素对成对列表进行排序,list,sorting,scheme,List,Sorting,Scheme,有没有人能给我一些建议,告诉我如何编写代码,根据每一对的第二个元素按递增顺序对一组对进行排序?我没有一个例子给你,但这似乎是一个简单的事情想象 让我们试着写一个合并排序 (define (mgsort ls cmp) (cond ((or (null? ls) (null? (cdr ls))) ls) ; right? ... then, (else (split ls '() '() cmp)))) 处理列表的最基本工具是结构递归:
(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
——一个将合并的函数,就像“zipping”一样,它的两个参数是排序列表,因此结果也是一个排序列表
(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))
(mgsort(列表3 1 5 4 6 2 3)是否有人可以在不使用内置scheme函数的情况下编写此函数?还是不可能?@JohnFriedrich:step 1)编写一个带有“cmp”参数的排序函数。步骤2)使用比较列表第二个元素的“cmp”参数调用它。因此,你的问题简单地归结为,如何在scheme中编写排序函数?@JohnFriedrich有比O(n²)更快的排序算法,因此不必非常失望。(最快的有O(n log n)最坏的时间;我相信再快也不可能了。)@ChrisJester Young你肯定忘了……:)谢谢,这看起来更像是我能理解的东西,因为我对这个计划比较陌生。