我在方案中实现合并排序,我必须通过定义两个辅助方法来实现:merge和split。
Merge采用两个列表(已按递增顺序)并将它们合并在一起。我这样做了如下:
(define merge
(lambda (list1 list2)
(if (null? list1)
list2
(if (null? list2)
list1
(if (< (car list1) (car list2))
(cons (car list1) (merge (cdr list1) list2))
(cons (car list2) (merge (cdr list2) list1)))))))
分裂方法让我很难过。我找到了一个用两个单独的方法('odd-numbers'和'even-numbers')完成这个的例子,但是我想知道是否有办法将这些方法组合成一个叫做'split'的方法?
此处的示例:merge sort in scheme
我显然对计划很新,任何人都可以帮我理解如何做到这一点吗?
答案 0 :(得分:3)
适合用作split
一部分的简单mergesort
实现如下:
(define (split lst)
(let ((half (quotient (length lst) 2)))
(list (take lst half)
(drop lst half))))
它将输入列表分成两半,将它们返回到列表列表中 - 第一个列表对应于前半部分,第二个列表对应于输入列表的后半部分。
根据问题的要求,另一个替代方案是将列表拆分为奇数/偶数元素,如下所示:
(define (split lst)
(list (filter odd? lst)
(filter even? lst)))
另一种选择,通过使用partition
,您可以在一次传递中拆分输入列表:
(define (split lst)
(let-values (((odds evens) (partition odd? lst)))
(list odds
evens)))
请注意,如果输入列表仅包含整数,则最后两个选项将仅用于 ,以便使用您自己的mergesort
实现对其他数据类型的列表进行排序,你'最好使用我的第一版split
。