したがって、それぞれが既に昇順でソートされている 2 つの入力リストを結合しています。昇順でも、それらを 1 つに「織り込み」たいと考えています。
そのためには、両方の head 要素 (各入力リストからそれぞれ) を取得して比較します。次に、そのリストから最小のものを取り出し、同じ関数を使用して、残っているものをさらに組み合わせます。
関連するソートはありません。結果のリストは、それを定義するプロセスのおかげで、すでにソートされています。
この操作は一般に「マージ」と呼ばれます。重複を保持します。同様に、2 つの順序付けられたリストを 1 つにマージする重複除去機能は、「結合」と呼ばれます。これは、これらの順序付けされた (降順でない、または厳密に昇順の) リストは、セットの表現と見なすことができるためです。
注意すべきもう 1 つの微妙な点は、2 つの head 要素が等しい場合にどうするかということです。重複を保存することは既に決定していますが、2 つのうちどちらを最初に取り出すのでしょうか?
通常は左側です。次に、そのような定義されmerge
た操作がマージソートの一部として使用されると、ソートは安定します(もちろん、そのためにもパーティション分割を適切に定義する必要があります)。安定とは、要素の元の順序が保持されることを意味します。
たとえば、ソートが安定している場合、ペアの最初の要素でソートすると、 は as ではなく as として(3,1) (1,2) (3,3)
ソートされることが保証されます。(1,2) (3,1) (3,3)
(1,2) (3,3) (3,1)
したがって、コードのスケルトンに従って、次のようになります
;; combine two non-decreasing lists into one non-decreasing list,
;; preserving the duplicates
(define (combineNONDECR l1 l2)
(cond
((null? l1) l2)
((null? l2) l1)
((<= (car l1) (car l2))
(cons (car l1) (combineNONDECR (cdr l1) l2)))
(t
(cons (car l2) (combineNONDECR l1 (cdr l2))))))
しかし、結果が非減少ではなく昇順であることが本当に必要な場合は、これを少し調整する必要があります-ケースを個別に作成し、個別に処理して、重複が忍び寄るのを防ぎます(それぞれの昇順リストに重複はありませんが、リストにはそれらの 2 つの間にいくつかの重複が含まれる場合があります)。=