Algorithm 为什么没有标准的合并排序?

Algorithm 为什么没有标准的合并排序?,algorithm,sorting,Algorithm,Sorting,在合并排序的合并算法中,我不明白我们必须使用辅助数组L,R?为什么我们不能在2个子数组L和R中保持2个指针对应我们正在比较的元素,这样合并排序算法就可以保持不变 谢谢。假设您拆分了阵列的s.th。L使用原始数组的前半部分,R使用后半部分 然后假设在合并过程中,R中的前几个元素小于L中最小的元素。如果要将它们放置在合并结果的正确位置,则必须覆盖L中尚未在合并步骤中处理的元素 当然,你可以做出不同的分割。但是你总是可以构造这样一个(然后稍微不同)的例子。假设你拆分了数组的s.th。L使用原始数组的前

在合并排序的合并算法中,我不明白我们必须使用辅助数组L,R?为什么我们不能在2个子数组L和R中保持2个指针对应我们正在比较的元素,这样合并排序算法就可以保持不变


谢谢。

假设您拆分了阵列的s.th。L使用原始数组的前半部分,R使用后半部分

然后假设在合并过程中,R中的前几个元素小于L中最小的元素。如果要将它们放置在合并结果的正确位置,则必须覆盖L中尚未在合并步骤中处理的元素


当然,你可以做出不同的分割。但是你总是可以构造这样一个(然后稍微不同)的例子。

假设你拆分了数组的s.th。L使用原始数组的前半部分,R使用后半部分

然后假设在合并过程中,R中的前几个元素小于L中最小的元素。如果要将它们放置在合并结果的正确位置,则必须覆盖L中尚未在合并步骤中处理的元素


当然,你可以做出不同的分割。但是,您总是可以构造这样一个(然后略有不同)的示例。

如果您曾经尝试在适当的位置编写合并排序,您很快就会发现为什么您无法合并两个子数组-您基本上需要读取和写入相同范围的数组,并且它会相互覆盖。因此,我们需要任何辅助阵列:

vector<int> merge_sort(vector<int>& vs, int l, int r, vector<int>& temp)
{
  if(l==r) return vs; // recursion must have an end condition

  int m = (l+r)/2;
  merge_sort(vs, l, m, temp);
  merge_sort(vs, m+1, r, temp);

  int il = l, ir=m+1, i=l;
  while(il <= m && ir <= r)
  {
    if(vs[il] <= vs[ir])
      temp[i++] = vs[il++];
    else
      temp[i++] = vs[ir++];
  }

  // copy left over items(only one of below will apply
  while(il <= m) temp[i++] = vs[il++];
  while(ir <= r) temp[i++] = vs[ir++];

  for(i=l; i<=r; ++i) vs[i] = temp[i];

  return vs;
}
vector merge\u排序(vector&vs、int-l、int-r、vector&temp)
{
if(l==r)return vs;//递归必须有一个结束条件
int m=(l+r)/2;
合并排序(vs、l、m、temp);
合并排序(vs,m+1,r,temp);
int-il=l,ir=m+1,i=l;

而(il如果您尝试在适当的位置写入合并排序,您很快就会发现为什么您无法合并2个子数组-您基本上需要读取和写入相同范围的数组,它将相互覆盖。因此,我们需要任何辅助数组:

vector<int> merge_sort(vector<int>& vs, int l, int r, vector<int>& temp)
{
  if(l==r) return vs; // recursion must have an end condition

  int m = (l+r)/2;
  merge_sort(vs, l, m, temp);
  merge_sort(vs, m+1, r, temp);

  int il = l, ir=m+1, i=l;
  while(il <= m && ir <= r)
  {
    if(vs[il] <= vs[ir])
      temp[i++] = vs[il++];
    else
      temp[i++] = vs[ir++];
  }

  // copy left over items(only one of below will apply
  while(il <= m) temp[i++] = vs[il++];
  while(ir <= r) temp[i++] = vs[ir++];

  for(i=l; i<=r; ++i) vs[i] = temp[i];

  return vs;
}
vector merge\u排序(vector&vs、int-l、int-r、vector&temp)
{
if(l==r)return vs;//递归必须有一个结束条件
int m=(l+r)/2;
合并排序(vs、l、m、temp);
合并排序(vs,m+1,r,temp);
int-il=l,ir=m+1,i=l;

虽然(il什么是标准合并排序,它是在哪里定义的?请尝试并找出答案。如果您没有明确提及正在查看的合并排序的实现/定义,您的问题就没有多大意义。就地执行合并排序并不容易。这个问题可能与此相关:什么是标准合并排序,它是在哪里定义的?t仔细检查并找出答案。如果您没有明确提及正在查看的合并排序的实现/定义,那么您的问题就没有多大意义。就地执行合并排序并不容易。此问题可能与以下相关: