合并排序:使用混合元素对列表进行排序

时间:2013-02-08 09:22:43

标签: sorting merge scheme mixed

我在Scheme中编写合并排序。我有一个合并排序定义,一个拆分列表和一个合并列表的合并。

(define mymergesort
  (lambda (alist)
    (if (null? (cdr alist)) alist
        (let ((splits (splitter alist)))
          (merge (mymergesort (car splits)) (mymergesort (cadr splits)))))))

(define splitter
  (λ (alist) (splitter-helper alist () ())))

(define splitter-helper
  (λ (alist list_a list_b)
    (cond ((null? alist) (cons (reverse list_a) (cons list_b ())))
          ((null? (cdr alist)) (cons (reverse (cons (car alist) list_a)) (cons list_b ())))
           (else (splitter-helper (reverse (cdr (reverse (cdr alist)))) (cons (car alist) list_a) (cons (car (reverse (cdr alist))) list_b))))))

(define merge
  (λ (list_a list_b)
    (cond ((null? list_a) list_b)
          ((null? list_b) list_a)
          ((<= (car list_a) (car list_b)) (cons (car list_a) (merge (cdr list_a) list_b)))
          ((<= (car list_b) (car list_a)) (cons (car list_b) (merge list_a (cdr list_b)))))))

这个实现似乎可以很好地排序数字列表。但我希望能够对混合元素列表进行排序。

例如: '(我可以“去”4“关于”123苏打水k?)

有任何建议/解决方案吗?我也试图避免使用大多数程序,比如长度“欺骗”递归解决方案。

1 个答案:

答案 0 :(得分:1)

你需要一个'启发式'来对这些项进行排名。例如,“走”是否在“约”之前出现? 4怎么样?因此,您可以编写一个函数来确定要排序的元素是否为另一个元素的“&lt; =”。此外,

(<= (car list_a) (car list_b))然后(<= (car list_b) (car list_a))有点多余。如果a不是&lt; = b,那么我们知道&gt;湾