Во время обучения XQuery я пытаюсь реализовать сортировку слияния.Почему этот фрагмент кода XQuery (Mergesort) не работает правильно?
Для объединения двух уже отсортированных последовательностей в один я хотел реализовать вспомогательную функцию, называемую «слияние».
В настоящее время выглядит следующим образом:
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
Идея заключалась в том, что я всегда проверяю, было ли первое число секвенций e больше или меньше, чем в другой последовательности. Затем я добавлял меньшее число к моему результату, сокращал последовательность с меньшим числом в подпоследовательность без только что добавленного числа и снова возвращался рекурсивно.
Условие break, когда одна из двух последовательностей пуста или и то, и другое.
Я не могу видеть свою ошибку на данный момент, возможно, это что-то малое, что я пропускаю.
Можете ли вы показать мне, где мне нужно изменить свой код, чтобы он работал правильно?
Большое спасибо за помощь.
Ваш ответ полностью верен. Теперь все в порядке. Большое спасибо, я до сих пор не видел опечатку. – Waylander
Вот почему я никогда не делаю Copy & Paste. Всегда лучше писать все сами. Даже если это займет больше времени. –