【问题标题】: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;)。一次从原始列表中删除一个节点,然后将该节点按顺序插入到排序列表中,或者扫描原始列表中的最大节点,删除该节点并在排序列表中添加该节点。
如果列表很大并且速度很重要,那么自下而上的合并排序要快得多。