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)”部分。看起来它检查左侧部分是否有“左”的元素。合并排序时甚至可能吗?
答案 0 :(得分:2)
合并两个已排序的列表(让我们称之为left
和right
)时,您会继续将一个项目添加到result
列表中,直到任何一个项目用完为止left
或right
列表。这是由第一个while
循环完成的。现在,您需要将左侧或右侧列表中剩余的元素添加到结果列表中。有两种选择:
左边的列表没有元素,右边的列表还有一些。在这里编写代码的方式,我们不需要做任何事情,因为S
数组的末尾已经包含right
列表中的最后一个元素。
右边的列表没有元素,左边的列表仍然有一些。然后我们将剩余的元素复制到S
的末尾。这就是if
末尾merge1
的作用。
关于你的问题,如果这段代码是“坏”:代码是正确的,但我会做一些更改,使其更具可读性:
left
和right
列表分隔的中点传递给merge1
,而不是重新计算。