单独链接列表上的Mergesort C ++

时间:2011-04-29 14:47:04

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

我正在寻找某种简单的方法,我可以学习并理解这些的合并排序。我已经在网上看了一下,发现合并排序对于单链表非常有用,但是我不知道怎么做。这是我发现的网站: 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);
};

1 个答案:

答案 0 :(得分:2)

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

  

从概念上讲,合并排序的作用是   如下

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

这简明扼要地告诉您需要做什么以及您需要什么样的操作。句子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)但实现它也可能没什么坏处。