我的MergeSort输出错误,您认为我的代码有什么问题?

时间:2012-11-18 09:50:26

标签: c++ mergesort output

    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)

我什么都想不到。请帮助。

2 个答案:

答案 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';
    }
}