XQuery を学習しながら、マージ ソートを実装しようとしています。
すでにソートされている 2 つのシーケンスを 1 つに結合するために、「マージ」と呼ばれるヘルパー関数を実装したいと考えました。
現在、次のようになっています。
declare function local:merge($seq1 as xs:integer*, $seq2 as xs:integer*) as xs:integer*{
if(empty($seq1) and empty($seq2)) then ()
else if(empty($seq1)) then $seq2
else if(empty($seq2)) then $seq1
else
let $zahl1 := $seq1[1]
let $zahl2 := $seq2[2]
return
if($zahl1 < $zahl2) then ($zahl1, local:merge(fn:subsequence($seq1,2), $seq2))
else if($zahl2 < $zahl1) then ($zahl2, local:merge($seq1, fn:subsequence($seq2,2)))
else ($zahl1, $zahl2, local:merge(fn:subsequence($seq1,2), fn:subsequence($seq2,2)))
};
私はこの呼び出しで自分のコードをテストしています:
local:merge((1,3,6,9,10), (1,2,4,6,8,11))
どういうわけか、結果は常に正しいとは限りません (これの下に、上記の呼び出しの結果があります)。
1 2 3 4 6 6 8 9 10 8 11
この背後にある考え方は、シーケンスの最初の数値が他のシーケンスの数値よりも大きいか小さいかを常にチェックするというものでした。次に、小さい数値を結果に追加し、小さい数値のシーケンスを、追加したばかりの数値のないサブシーケンスに切り取り、再帰的に繰り返します。
ブレーク条件は、2 つのシーケンスのいずれかまたは両方が空である場合です。
現時点では自分の間違いがわかりません。おそらく、見落としている小さな問題です。
コードが正しく動作するようにコードを変更する必要がある場所を教えてもらえますか?
どうもありがとうございました。