我需要實現歸併的算法如下界面實現: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 –