为什么Merge Sort的Merge()函数有一个有条件的第二个循环?

时间:2010-04-23 23:28:39

标签: algorithm sorting merge pseudocode mergesort

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)”部分。看起来它检查左侧部分是否有“左”的元素。合并排序时甚至可能吗?

1 个答案:

答案 0 :(得分:2)

合并两个已排序的列表(让我们称之为leftright)时,您会继续将一个项目添加到result列表中,直到任何一个项目用完为止leftright列表。这是由第一个while循环完成的。现在,您需要将左侧或右侧列表中剩余的元素添加到结果列表中。有两种选择:

  • 左边的列表没有元素,右边的列表还有一些。在这里编写代码的方式,我们不需要做任何事情,因为S数组的末尾已经包含right列表中的最后一个元素。

  • 右边的列表没有元素,左边的列表仍然有一些。然后我们将剩余的元素复制到S的末尾。这就是if末尾merge1的作用。


关于你的问题,如果这段代码是“坏”:代码是正确的,但我会做一些更改,使其更具可读性:

  • 描述性变量名称。
  • leftright列表分隔的中点传递给merge1,而不是重新计算。