MergeSort.使用迭代程序实现
MergeSort. Implementation with Iterators
我需要用以下接口实现mergesort的算法:
template <typename T, typename Comp>
void mergesort(T begin, T end, Comp comp);
其中begin和end-某个T类型容器的元素的迭代器,comp-是比较存储在容器中的元素的函数。和
template <typename T, typename Comp>
void merge(T beginLeft, T endLeft, T beginRight, T endRight,
T beginResult, Comp comp);
是合并两个排序容器的函数(beginLeft和endLeft-第一个容器的迭代器,beginRight,endRight-第二个),结果应该是新合并容器beginResult的开始迭代器。
它应该是这样的。
我已经为合并排序编写了递归函数,它调用合并过程。
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工作正常,但我不太明白mergesor应该如何工作。我应该向提出什么论点
merge<T, Comp>(begin, middle, middle, end, /?...?/, comp);
如果我只通过开始,那么排序的结果是不正确的。或者我应该把一些临时集装箱送到那里。但是,如果我只有迭代器的类型,而不知道元素的类型,我该如何创建它呢?
我将感谢你的帮助。非常感谢。
--已添加--
合并示例:
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
当然不能使用begin
来存储结果。您仍在读取begin
并进行合并,因此通过向其写入,您将覆盖可能仍未读取的数据。
您需要临时内存来将结果写入其中,然后将其复制回原始内存。内存可以是任何类型,只要你能在上面找到迭代器。比如说std::vector
。
不过,这是一个根本问题。merge
中所有五个迭代器的类型都是T
,但至少beginResult
的类型应该是可能不同的迭代器。否则,正如您所观察到的,您就不知道要使用什么临时容器。
由于您已经链接了自己,std::merge
的模板对于left
、right
和result
迭代器具有不同的迭代器类型。
注意:要分配临时内存,您需要知道T
是其迭代器的元素类型。这只是由T::value_type
完成的。请参见此处。
这样的东西应该可以工作:
template<class BiDirIt, class Compare = std::less<typename std::iterator_traits<BiDirIt>::value_type>>
void merge_sort(BiDirIt first, BiDirIt last, Compare cmp = Compare())
{
auto const N = std::distance(first, last);
if (N < 2) return;
auto middle = first + N / 2;
merge_sort(first, middle, cmp);
merge_sort(middle, last, cmp);
std::inplace_merge(first, middle, last, cmp);
}
您可以这样创建向量:
std::vector<std::iterator_traits<T>::value_type> result;
在助手函数中,然后调用您的排序例程:
merge_sort(first, last, result.begin());
然后,一旦函数返回结果,就可以将结果复制到由用户提供的迭代器表示的向量中。
- 将类实现到数据库程序中
- 如何为模块化应用程序实现C++插件系统
- 如何使用命令提示符、记事本和 MinGW 使用主文件、头文件和实现文件编译C++程序?
- 比较迭代器会使程序崩溃,而不会在自定义气泡排序实现中出现错误
- 为 Sql 服务器实现 odbc 包装器.将数据库数据读取为字符或要求驱动程序将数据转换为 C 类型
- 如何在C / C++中正确实现链接列表而不会使程序崩溃
- 如何在程序中实现单词跳过解决方案
- 如何使用winsock在c++应用程序中实现安全套接字通信
- 在给定程序中降低矢量数组实现堆栈的时间复杂度有哪些不同的可能方法?
- 如何实现否定用户输入退出程序和打印列表?
- 在 MFC 应用程序中实现 IServiceProvider
- CEF C++ 实现下载处理程序
- 如何在 2 个应用程序之间实现拖放?
- C 简单的程序实现
- 如何使用Microsoft PPL轻量级任务调度程序实现后退
- MergeSort.使用迭代程序实现
- 最大子阵列程序实现未终止
- 如何为Web Prediciton程序实现SVM
- 为地铁应用程序实现 directx IMFmediaEngineProtectedContent 时遇到问题
- c++简单程序实现中的继承和虚函数错误