0
我在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)))))))
這個實現似乎很適合排序數字列表。但我想能夠排序混合元素的列表。
例如: 「(I可以 「走」 4 「約」 123汽水Kα)
任何建議/解決方案?我也試圖避免使用大多數程序,比如「欺騙」遞歸解決方案。
謝謝!起初,我認爲你的回答非常簡單,但我坐下來,真正完成了它,實施了我自己的程序。它非常完美! :) 6:48 AM,但。 – kud0h