merge1(int low, int high, int S[], U[])
{
int k = (high - low + 1)/2
for q (from low to high) U[q] = S[q]
int j = low
int p = low
int i = low + k
while (j <= low + k - 1) and (i <= high) do
{
if (U[j] <= U[i])
{
S[p] := U[j]
j := j+1
}
else
{
S[p] := U[i]
i := i+1
}
p := p+1
}
if (j <= low + k - 1)
{
for q from p to high do
{
S[q] := U[j]
j := j+1
}
}
}
merge_sort1(int low, int high, int S[], U[])
{
if low < high
{
int k := (high - low + 1)/2
merge_sort1(low, low+k-1, S, U)
merge_sort1(low+k, high, S, U)
merge1(low, high, S, U)
}
}
Итак, в основном, это на моих лекциях. В целом я нахожу это довольно запутанным, но я понимаю большую его часть. То, что я не понимаю, - это необходимость части «if (j < = low + k - 1)». Похоже, он проверяет, есть ли в левой части какие-либо элементы «слева». Это возможно даже при слиянии?Почему функция Merge Sort's Merge() имеет условный второй цикл?
Да. Возьмем в качестве примера 'merge1 (0, 1, {2, 1})' и пройдитесь через код. –
Средняя точка также может быть рассчитана на (высокий-низкий)/2, правильно? Я просто не уверен, как убедиться, что я не пропущу никаких значений. – 2010-04-24 15:11:53
@SebKom: Нет, (high-low)/2 слишком мало. Предположим, что существует 2 элемента, поэтому 'high-low == 1' и' (high-low)/2 == 0'. Если вы используете это для разделения списка, вы получите 0 элементов в левом списке и 2 элемента справа. То же самое произойдет при сортировке правого списка и т. Д., Что приведет к бесконечной рекурсии. – interjay