2013-03-30 4 views
0

Во время обучения 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, когда одна из двух последовательностей пуста или и то, и другое.

Я не могу видеть свою ошибку на данный момент, возможно, это что-то малое, что я пропускаю.

Можете ли вы показать мне, где мне нужно изменить свой код, чтобы он работал правильно?

Большое спасибо за помощь.

ответ

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] 
    ... 
+0

Ваш ответ полностью верен. Теперь все в порядке. Большое спасибо, я до сих пор не видел опечатку. – Waylander

+0

Вот почему я никогда не делаю Copy & Paste. Всегда лучше писать все сами. Даже если это займет больше времени. –

0

Конечно гораздо проще способ сортировки это:

for $i in $sequence order by $i return $i 
Смежные вопросы