我需要实现归并的算法如下界面实现:MergeSort。与迭代器
template <typename T, typename Comp>
void mergesort(T begin, T end, Comp comp);
其中开始和年底 - 迭代器类型T的一些容器的元素,补偿 - 是比较要素的功能,它们存储在容器中。和
template <typename T, typename Comp>
void merge(T beginLeft, T endLeft, T beginRight, T endRight,
T beginResult, Comp comp);
是两个已排序的容器的合并的功能(beginLeft和endLeft - 迭代器的第一容器的,beginRight和endRight - 第二)和结果应当是迭代器开始新合并的容器beginResult。
应该看起来像this。
我已经写了递归函数的归并排序,这就要求合并的过程。
template <typename T, typename Comp>
void mergesort(T begin, T end, Comp comp)
{
if (begin == std::prev(end))
{
return;
}
T middle = begin + std::distance(begin, end)/2;
mergesort<T, Comp>(begin, middle, comp);
mergesort<T, Comp>(middle, end, comp);
merge<T, Comp>(begin, middle, middle, end, begin, comp);
}
template <typename T, typename Comp>
void merge(T beginLeft, T endLeft, T beginRight, T endRight,
T beginResult, Comp comp)
{
while (beginLeft != endLeft && beginRight != endRight)
{
if (comp(*beginLeft, *beginRight))
{
*beginResult = *beginLeft;
++beginResult;
++beginLeft;
}
else
{
*beginResult = *beginRight;
++beginResult;
++beginRight;
}
}
while (beginLeft != endLeft)
{
*beginResult = *beginLeft;
++beginResult;
++beginLeft;
}
while (beginRight != endRight)
{
*beginResult = *beginRight;
++beginResult;
++beginRight;
}
}
功能合并正常工作,但我不太明白,怎么归并应该工作。我应该通过什么参数
merge<T, Comp>(begin, middle, middle, end, /?...?/, comp);
如果我通过只是开始那里,比排序的结果是不正确的。或者我应该通过那里临时容器。但是我怎么能创建它,如果我只有迭代器的类型,并且不知道元素的类型?
我将是你的帮助表示感谢。谢谢!
--ADDED ---
合并的实施例:
vector<int> vec1;
vector<int> vec2;
vector<int> vec3(6);
vec1.push_back(1);
vec1.push_back(3);
vec1.push_back(5);
vec2.push_back(2);
vec2.push_back(4);
vec2.push_back(6);
merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), vec3.begin(), std::less<int>());
for (int i = 0; i < vec3.size(); ++i)
{
std::cout << vec3[i] << std::endl;
}
输出为:1 2 3 4 5 6
如何知道*合并*如果你甚至不知道如何调用它,它可以正常工作? –
你需要的是就地合并排序。这是不容易实现,因为此链接指出: http://stackoverflow.com/questions/2571049/how-to-sort-in-place-using-the-merge-sort-algorithm –