List List:: mergesort(List m)
{
if(m.count() <= 1)
return m;
else
{
List l,r;
node* temp = m.head;
node* ptemp = m.head;
node* first = m.head;
int c = m.count();
for(int i = 1; temp->next!=NULL && i<=(c/2)+1; i++)
{
ptemp = temp;
temp = temp->next;
}
ptemp->next = NULL;
while(first!=NULL)
{
l.insert(first->data);
first = first->next;
}
while(temp!=NULL)
{
r.insert(temp->data);
temp = temp->next;
}
cout<<"\t\t";
l.display();
cout<<"\t\t";r.display();cout<<"\n";
l = mergesort(l);
r = mergesort(r);
}
}
我试图在'合并排序算法的划分步骤中显示每一步。
例如我输入此列表:5 3 7 14 2
期望的输出: -
5 3 7 14 2
5 3 7 14 2
5 3 7 14 2
5 3 7 14 2
我得到的是:
5 3 7 14 2
5 3 7 14 2
5 3 7
5 3
14 2
我该怎么办?我已经尝试了所有可能的事情,但甚至无法接近。 请帮忙吗?
好的,这是我在调试后理解的, 函数mergesort()内部的内容是:
mergesort(5 3 7 14 2)
mergesort(5 3 7)
mergesort(5 3)
mergesort(14 2)
我需要的是: -
mergesort(5 3 7 14 2)
mergesort(5 3 7)
mergesort(14 2)
mergesort(5 3)
我什么都想不到。请帮助。
答案 0 :(得分:1)
你正在错误地铺设树。你永远不会得到像这样显示的'mergesort tree',因为你无法在控制台输出中向上移动。相反,你应该将树旋转90度。喜欢这个
List List:: mergesort(List m, int depth)
{
for (int i = 0; i < depth; ++i)
cout << '\t';
display();
cout << '\n';
...
l = mergesort(l, depth + 1);
r = mergesort(r, depth + 1);
}
深度变量控制在显示您在此调用中排序的值之前显示的缩进量。每个调用的值都显示在单独的行中。这会将树旋转90度,这样根就会显示在控制台的左边缘,子节点跟随父节点并逐渐向右移动。
答案 1 :(得分:0)
我尝试创建一个类似你描述的树的方式(虽然不完全相同,因为mergesort()
不会为一个元素序列创建另一个级别)是建立一个中间状态树和然后使用树的Breadth-First Search步行来实际显示它。除了将树实际构建为单独的数据结构之外,您可以实现mergesort()
不使用递归,而是自己控制中间步骤,有效地使用隐式树的广度优先搜索步骤。
以下是我的意思的一个例子。输出格式不是很好,但至少每行都包含预期的内容。此外,输出显示拆分和中间合并的中间结果。
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
using namespace std::placeholders;
typedef std::vector<int> range;
std::ostream& print_range(std::ostream& out, range const& v)
{
out << '[';
if (!v.empty()) {
std::copy(v.begin(), v.end() - 1,
std::ostream_iterator<int>(out, ", "));
out << v.back();
}
return out << "] ";
}
std::vector<range>
mergesort(std::vector<range> const& rs)
{
std::cout << "> ";
std::for_each(rs.begin(), rs.end(),
[](range const& r) { print_range(std::cout, r); });
std::cout << "\n";
if (rs.end() != std::find_if(rs.begin(), rs.end(),
[](range const& r) {
return 1 < r.size();
})) {
std::vector<range> sr;
std::for_each(rs.begin(), rs.end(),
[&](range const& r) {
sr.push_back(range(r.begin(),
r.begin() + r.size() / 2));
sr.push_back(range(r.begin() + r.size() / 2,
r.end()));
});
sr = mergesort(sr);
std::vector<range> result;
for (range::size_type i(0); i + 1 < sr.size(); i += 2) {
result.push_back(range());
std::merge(sr[i].begin(), sr[i].end(),
sr[i + 1].begin(), sr[i + 1].end(),
std::back_inserter(result.back()));
}
std::cout << "< ";
std::for_each(result.begin(), result.end(),
[](range const& r) { print_range(std::cout, r); });
std::cout << "\n";
return result;
}
else {
return rs;
}
}
range mergesort(range const& input)
{
return mergesort(std::vector<range>(1, input)).front();
}
int main()
{
try
{
range input{std::istream_iterator<int>(std::cin),
std::istream_iterator<int>()};
mergesort(input);
}
catch (std::exception const& ex)
{
std::cout << "ERROR: " << ex.what() << '\n';
}
}