计划中的合并

时间:2013-02-01 22:52:08

标签: lisp scheme

我正在编写Scheme中的mergesort,我很好奇为什么这不起作用......

这是我希望实现的实现,但不是:

(define (mergesort op l)
  (cond ((null? l) l)
      ((null? (cdr l)) l)
      (else (merge op (car l)
                      (mergesort op (cdr l))))
  )
)

这是'正确'的实施。

(define (mergesort op l)
  (cond ((null? l) l)
      ((null? (cdr l)) l)
      (else (merge op (cons (car l) (list))
                      (mergesort op (cdr l))))
  )
)

为什么我必须(cons(car l)(list))在尝试将它与递归合并之前?

2 个答案:

答案 0 :(得分:4)

请注意:

(cons (car l) (list))

......等同于:

(list (car l))

换句话说,您必须使用单个元素传递列表,而不仅仅是元素作为merge过程的第二个参数。

答案 1 :(得分:2)

奥斯卡是完全正确的,但有一件事情被忽略了。

这不是mergesort。 mergesort的定义是什么?它接受列表,将其拆分为一半,对每个排序列表进行排序,然后将它们合并在一起。

你没有分成两半;你分成了一个,其余的。然后对其余部分进行排序,并将单个元素合并到列表中。但您可以考虑将单个元素合并到列表中,将元素插入列表中。

啊,有一个线索!你写过insertion sort。哪个罚款;有用。它效率低得多。

因此,mergesort和插入排序之间的区别在于选择错误的位置来拆分列表。