Algorithm 为什么没有标准的合并排序?
在合并排序的合并算法中,我不明白我们必须使用辅助数组L,R?为什么我们不能在2个子数组L和R中保持2个指针对应我们正在比较的元素,这样合并排序算法就可以保持不变Algorithm 为什么没有标准的合并排序?,algorithm,sorting,Algorithm,Sorting,在合并排序的合并算法中,我不明白我们必须使用辅助数组L,R?为什么我们不能在2个子数组L和R中保持2个指针对应我们正在比较的元素,这样合并排序算法就可以保持不变 谢谢。假设您拆分了阵列的s.th。L使用原始数组的前半部分,R使用后半部分 然后假设在合并过程中,R中的前几个元素小于L中最小的元素。如果要将它们放置在合并结果的正确位置,则必须覆盖L中尚未在合并步骤中处理的元素 当然,你可以做出不同的分割。但是你总是可以构造这样一个(然后稍微不同)的例子。假设你拆分了数组的s.th。L使用原始数组的前
谢谢。假设您拆分了阵列的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仔细检查并找出答案。如果您没有明确提及正在查看的合并排序的实现/定义,那么您的问题就没有多大意义。就地执行合并排序并不容易。此问题可能与以下相关: