我正在考虑对链表进行排序的方法,我提出了两种不同的方式(使用BubbleSort,因为我在编程方面相对较新,对我来说这是最简单的算法)。示例结构:
struct node {
int value;
node *next;
};
两种不同的方法:
swap(root->value, root->next->value)
我对这个主题进行了一些谷歌搜索,从它的外观来看,第一种方法似乎更受欢迎。根据我的经验,重新排列列表比简单地交换实际节点值更复杂。重新排列整个列表有什么好处,如果是,那是什么?
答案 0 :(得分:4)
我可以想到两个好处:
1)可能存在其他指针,指向此列表中的节点。如果重新排列列表,这些指针仍将指向排序前指向的相同值;如果你交换价值,他们就不会。 (这两个中哪一个更好取决于您的设计细节,但有些设计中,如果它们仍然指向相同的值,则更好。)
2)对于一个单纯的列表来说并不重要,但最终你可能会对一系列更复杂的事情进行排序,因此交换价值非常昂贵甚至是不可能的。
答案 1 :(得分:1)
正如Beta所回答的那样,重新排列节点(通过下一个指针)比交换节点数据更好。
如果实际使用冒泡排序或任何类型的"交换"通过指针节点,将下一个(或头)指针交换到要首先交换的两个节点,然后将这两个节点交换为下一个指针。这将处理旋转3个指针的相邻节点情况,以及交换2对指针的正常情况。
另一个简单的选择是为排序列表创建一个新的空列表(node * pNew = NULL;)。一次从原始列表中删除一个节点,然后按顺序将该节点插入到排序列表中,或扫描最大节点的原始列表,删除该节点并在该节点前面添加已排序列表。
如果列表很大且速度很重要,那么自下而上合并排序要快得多。