我正在阅读 Robert Sedgewick 在 C++ 中的算法中的合并排序,并有以下问题。
static void mergeAB(ITEM[] c, int cl, ITEM[] a, int al, int ar, ITEM[] b, int bl, int br )
{
int i = al, j = bl;
for (int k = cl; k < cl+ar-al+br-bl+1; k++)
{
if (i > ar) { c[k] = b[j++]; continue; }
if (j > br) { c[k] = a[i++]; continue; }
c[k] = less(a[i], b[j]) ? a[i++] : b[j++];
}
}
基本合并的一个值得注意的特点是,内部循环包括两个测试,以确定两个输入数组的末端是否已经到达。当然,这两个测试通常会失败,因此需要使用哨兵密钥来删除测试。也就是说,如果将一个键值大于所有其他键的元素添加到 a 和 aux 数组的末尾,则可以删除测试,因为当 a(b) 数组耗尽时,哨兵会导致从 b (a) 数组中取出 c 数组的下一个元素,直到合并完成。
但是,使用哨兵并不总是那么容易,因为可能不容易知道最大的键值,或者因为空间可能不方便。
对于合并,有一个简单的补救措施。该方法基于以下思想:鉴于我们已经习惯于复制数组以实现就地抽象,我们只需将第二个数组在复制时以相反的顺序排列(无需额外成本),以便其关联索引从右向左移动。这种排列导致最大的元素——无论它在哪个阵列中——充当另一个阵列的哨兵。
我对上述文字的问题
什么语句“当 a (b) 数组用尽时”?这里的'a(b)'是什么?
为什么作者提到确定最大键并不容易,确定最大键时空间与空间有什么关系?
作者所说的“鉴于我们不得不复制数组”是什么意思?在这种情况下辞职是什么?
要求用简单的例子来理解作为简单补救措施提到的想法?