我的 MergeSort 显示错误的输出,您认为我的代码有什么问题
My MergeSort is showing the wrong output, what do you think is wrong with my code?
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<<"tt";
l.display();
cout<<"tt";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() 内部的内容是:
合并排序(5 3 7 14 2)
合并排序(5 3 7)
合并排序(5 3)
合并排序(14 2)
我需要的是:-
mergesort(5 3 7 14 2)
mergesort(5 3 7)
mergesort(14 2)
mergesort(5 3)
我什么都想不起来。请帮忙。
你把树布置错了。您永远不会像这样显示"合并排序树",因为您无法在控制台输出中向上移动。相反,您应该将树旋转 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 度,以便根显示在控制台的左边缘,子节点跟随其父节点,并逐渐向右移动。
我尝试创建像您描述的树(尽管不完全相同,因为mergesort()
不会为一个元素序列创建另一个级别)的方法是构建一个中间状态树,然后使用树的广度优先搜索遍历来实际显示它。除了实际将树构建为单独的数据结构之外,您还可以实现不使用递归而是自己控制中间步骤的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';
}
}
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么我的代码在输出中增加了93天
- 0-1背包代码中的错误.我的代码中有什么错误
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 在我的代码中,获得最大的Pair Wise产品C++和输出并不总是正确的
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 如何重写全局方法名称以在调用原始方法之前将我的代码推到前面
- 我的代码运行良好,但在游戏循环中中断
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?
- 我认为我的代码很好,但它在 cin a 之后停止并且没有进一步?
- 我的代码中的意外价值以及我如何修复它
- 为什么 rand 不在我的代码中生成随机数?
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 如何改进我的代码,使其不会因超时而终止?(黑客排名挑战)
- 无法找出我的代码中的内存泄漏
- 我不明白为什么我的代码不起作用并且需要更长的时间来运行
- 我正在尝试创建一个菜单,但我的代码一直在循环