【问题标题】:Mergesort on a Singly Linked List C++单链表 C++ 上的合并排序
【发布时间】:2011-08-15 13:40:56
【问题描述】:

我正在寻找一种可以学习和理解合并排序的简单方法。我在网上查看过,发现合并排序对于单链表非常有用,但我不明白该怎么做。这是我找到的网站: Wikipedia Merge sortSpecifically linked lists

我不确定要给你什么代码。我基本上只是在我的头文件中有这个,并且是对此的新手,所以我非常基础。提前感谢您的帮助:)

class Node
{
public:
    int data;
    Node* next;
    Node()
    {
        next = NULL;
        data = 0;
    }
};

class SLLIntStorage
{
public:
    Node* head;
    Node* current;
    Node* tail;

    void Read(istream&);
    void Write(ostream&);
    void setReadSort(bool);
    void sortOwn();
    void print();

    bool _sortRead;
    int numberOfInts;

    SLLIntStorage(const SLLIntStorage& copying)
    {

    }

    SLLIntStorage(void);
    ~SLLIntStorage(void);
};

【问题讨论】:

    标签: c++ mergesort singly-linked-list


    【解决方案1】:

    如果你从维基百科看这一段

    从概念上讲,归并排序的工作原理是 关注

    1. 如果列表的长度为 0 或 1,则它已经排序。否则:
    2. 将未排序的列表分成两个大约一半大小的子列表。
    3. 通过重新应用归并排序对每个子列表进行递归排序。
    4. 将两个子列表合并回一个排序列表。

    这非常简洁地告诉您需要做什么以及需要什么样的操作。第 2 句和第 4 句是您需要能够执行Split()Merge() 的操作。拆分可以在您的 Node 类上实现为

    // Split: removes half of the list and returns a pointer to it
    Node* Node::Split()
    {
    } 
    

    类似地,Merge 可以实现为

    // Merge: insert elements from source in order
    Node::Merge(Node* source)
    {
    }
    

    作为一个整体 1,2,3,4 描述了执行实际排序所需执行的操作,通过使用列表操作 Merge 和 Split 在排序函数中按顺序实现这些步骤。

    这只是MergeSplit 的一种方式,你如何实现它们将取决于你的风格、要求、C++ 知识和各种其他因素。 (我相信您会在答案中看到其他一些解决方案)。您可能还需要Node::Append(Node* val) 或类似于基本运算符的东西。看起来您不需要Node::Remove(Node* val),但实现它也可能没有坏处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 2020-09-25
      • 1970-01-01
      相关资源
      最近更新 更多