【问题标题】:Difference between ways of sorting linked lists c++排序链表c ++的方式之间的区别
【发布时间】:2015-05-21 01:53:53
【问题描述】:

我正在考虑对链表进行排序的方法,我想出了两种不同的方法(使用 BubbleSort,因为我在编程方面相对较新,而且它对我来说是最简单的算法)。示例结构:

struct node {
  int value;
  node *next;
};

两种不同的方法:

  • 重新排列列表元素
  • 做类似swap(root->value, root->next->value)的事情

我对该主题进行了一些谷歌搜索,从外观上看,第一种方法似乎更受欢迎。根据我的经验,重新排列列表比简单地交换实际节点值更复杂。重新排列整个列表有什么好处,如果有,有什么好处?

【问题讨论】:

    标签: c++ sorting linked-list


    【解决方案1】:

    我能想到两个优点:

    1) 可能存在其他指针,指向此列表中的节点。如果重新排列列表,这些指针仍将指向它们在排序之前指向的相同值;如果你交换值,它们不会。 (这两者中哪一个更好取决于您的设计细节,但有些设计如果它们仍然指向相同的值会更好。)

    2) 对于单纯的 int 列表并不重要,但最终您可能会对更复杂的列表进行排序,因此交换值非常昂贵,甚至是不可能的。

    【讨论】:

      【解决方案2】:

      正如 Beta 所回答的,重新排列节点(通过 next 指针)比交换节点数据更好。

      如果实际使用冒泡排序或任何通过指针“交换”节点的排序,则将下一个(或头)指针交换到首先要交换的两个节点,然后交换这两个节点的下一个指针。这既可以处理旋转 3 个指针的相邻节点情况,也可以处理交换 2 对指针的正常情况。

      另一个简单的选项是为排序列表创建一个新的空列表(node * pNew = NULL;)。一次从原始列表中删除一个节点,然后将该节点按顺序插入到排序列表中,或者扫描原始列表中的最大节点,删除该节点并在排序列表中添加该节点。

      如果列表很大并且速度很重要,那么自下而上的合并排序要快得多。

      【讨论】:

        猜你喜欢
        • 2013-08-10
        • 1970-01-01
        • 1970-01-01
        • 2012-12-23
        • 1970-01-01
        • 1970-01-01
        • 2016-07-07
        • 2018-08-22
        • 1970-01-01
        相关资源
        最近更新 更多