0

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 つのシーケンスのいずれかまたは両方が空である場合です。

現時点では自分の間違いがわかりません。おそらく、見落としている小さな問題です。

コードが正しく動作するようにコードを変更する必要がある場所を教えてもらえますか?

どうもありがとうございました。

4

2 に答える 2

1

関数の 9 行目にコピー/貼り付けエラーがlet $zahl2 := $seq2[2]ありますlet $zahl2 := $seq2[1]。関数の残りの部分は正しく機能します。

ただし、次の引数も空の を返すため、両方の引数が空の場合はチェックを省略でき$seq2ます。

  if(empty($seq1)) then $seq2
  else if(empty($seq2)) then $seq1
  else
    let $zahl1 := $seq1[1]
    ...
于 2013-03-30T17:07:47.413 に答える