任何人都可以给我一个精心编写的实现,如何使用辅助函数(基于每对的汽车价值)在方案中订购对的列表?例如,'((3 2)(1 2)(8 4)(0 6))应按'((0 6)(1 2)(3 2)(8 4))排序。这似乎是一件很简单的事情,但出于某种原因,我正在画一个空白。
答案 0 :(得分:1)
首先,您可以使用自己喜欢的内置sort
例程,并指定按car
排序,例如在共同的LISP中
(sort ls #'< :key #'car)
如果您的Scheme无法指定key
,您可以通过比较程序模拟这个
(sort ls (lambda (a b) (< (car a) (car b))))
第二,如果你想重新实现这个,你可以使用mergesort的方法:将你的列表分成单调增加部分,然后成对地合并它们,直到只剩下一个。在Haskell,
mergesortBy f xs
| null xs = []
| [s] <- until (null.tail) (pairwise (mergeBy f)) (breakup xs) = s
pairwise g (a:b:t) = g a b : pairwise g t
pairwise _ t = t
breakup xs = [[x] | x <- xs] -- a list of (a list of x) for x in xs
由于这些部分单调增加(或至少不减少),mergeBy
可以轻松实现。
当然,写得很好&#34;实现将用初始阶段替换这里显示的基本breakup
,初始阶段将尝试生成更长的块,保留非递减和反转非增加的块(Haskell示例为here) 。 pairwise
和mergeBy
(以及甚至breakup
)函数必须融合为一个,以使整体实现更多在线,因为Scheme是(通常)严格(即非懒惰)语言。您可以在要合并的内部列表中使用显式挂起,以便从排序列表is an O(n) operation中取出一些第一个元素。