我正在尝试实现合并排序,但是我的代码似乎缺少了一些东西。该代码似乎为最终结果错误地附加了每个子排序数组,并且在某些情况下,添加了元素的副本。
例如,如果我运行A=[1,3,5,2,4,6]
该函数,我会得到A=[1,2,3,2,4,5,6]
;似乎在1,2,3
和之间夹了2个额外的字符4,5,6
。另一个例子是A=[4,2,9,8,11,3]
。当“排序”时,我得到A=[3,4,2,8,3,9,11]
。为什么会这样呢?
vector<int> mergeSort(vector<int> A)
{
if(A.size()<=1)
{
//print(A);
return A;
}
vector<int> left;
vector<int> right;
for(unsigned int i=0; i < A.size()/2; i++)
left.push_back(A[i]);
for(unsigned int i=A.size()/2; i < A.size(); i++)
right.push_back(A[i]);
vector<int> sortedLeft = mergeSort(left);
vector<int> sortedRight = mergeSort(right);
vector<int>::iterator iterL=left.begin();
vector<int>::iterator iterR;
vector<int> output;
while(iterL != left.end())
{
iterR=right.begin();
while(iterR != right.end())
{
if(*iterR < *iterL)
{
//cout << "Pushing back " << *iterR << endl;
output.push_back(*iterR);
}
iterR++;
}
//cout << "Pushing back " << *iterL << endl;
output.push_back(*iterL);
iterL++;
}
iterR=right.begin();
while(iterR != right.end())//appends left-over elements in right to output
{
if(find(output.begin(), output.end(), *iterR) == output.end())
{
//cout << "Pushing back " << *iterR << endl;
output.push_back(*iterR);
}
iterR++;
}
return output;
下面是更新的while循环:
while(iterL != left.end())
{
iterR=right.begin();
while(iterR != right.end() && *iterR != -1)
{
if(*iterR < *iterL)
{
//cout << "Pushing back " << *iterR << endl;
output.push_back(*iterR);
*iterR = -1;
}
iterR++;
}
//cout << "Pushing back " << *iterL << endl;
output.push_back(*iterL);
iterL++;
}
iterR=right.begin();
while(iterR != right.end())//appends left-over elements in right to output
{
if(*iterR != -1)
{
output.push_back(*iterR);
}
iterR++;
}
您的主要错误在于此循环的设计:
while(iterL != left.end())
{
iterR=right.begin();
while(iterR != right.end())
{
if(*iterR < *iterL)
{
//cout << "Pushing back " << *iterR << endl;
output.push_back(*iterR);
}
iterR++;
}
//cout << "Pushing back " << *iterL << endl;
output.push_back(*iterL);
iterL++;
}
考虑如果左边的范围是3, 4
,右边的范围是,会发生什么1, 2
。
在第一个迭代中,它将两个正确的元素添加到您的输出中。
在第二次迭代中,它将重置iterR
,如此反复。
剩下的输出是1, 2, 3, 1, 2, 4
。
如果您设法正确地保持有关正确向量的哪个元素已被处理的状态,则有关剩余元素的问题将自行消失。
::std::merge
可能会更好。
您一直在按值传递向量。
您的代码仅适用于vector<int>
,这在C ++中是不必要的限制。模板使阳光明媚。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句