链表排序方式的不同之处
Difference between ways of sorting linked lists c++
我正在考虑排序链表的方法,我想出了两种不同的方法(使用BubbleSort,因为我在编程方面相对较新,它对我来说是最简单的算法)。示例结构:
struct node {
int value;
node *next;
};
两个不同的方法:
- 重新排列列表元素
- 做一些类似
swap(root->value, root->next->value)
的事情
我在谷歌上搜索了一下这个主题,从表面上看,第一种方法似乎更受欢迎。根据我的经验,重新排列列表比简单地交换实际节点值要复杂得多。重新排列整个列表有什么好处吗?如果有,是什么好处?
我能想到两个优点:
1)可能存在其他指针,指向该列表中的节点。如果你重新排列列表,这些指针仍然会指向它们在排序前所指向的相同值;如果你交换值,它们就不会。(这两种方法哪个更好取决于你的设计细节,但在某些设计中,如果它们仍然指向相同的值,那就更好了。)
正如Beta所回答的那样,重新排列节点(通过下一个指针)比交换节点数据更好。
如果实际使用冒泡排序或任何通过指针"交换"节点的排序,则首先将下一个(或头)指针交换到要交换的两个节点,然后交换这两个节点的下一个指针。这既可以处理相邻节点的情况,即旋转3个指针,也可以处理交换2对指针的正常情况。
另一个简单的选项是为已排序的列表创建一个新的空列表(node * pNew = NULL;)。每次从原始列表中删除一个节点,然后按顺序将该节点插入已排序列表中,或者扫描原始列表中最大的节点,删除该节点,并在已排序列表中添加该节点。
如果列表很大并且速度很重要,那么自底向上的归并排序要快得多。
相关文章:
- 如何使用 std::sort 以'custom'的方式就地对数组进行排序
- 是否存在用于按以下方式对两个范围进行排序和分区的标准算法?
- 使用按插入方式排序的参数创建哈希映射
- 重载小于 (<) 运算符,用于以多种方式对对象进行排序
- Visual Studio:热键/自动对.h中的函数进行排序以与.cpp保持一致的方式
- 对标准库容器类型进行排序的static_assert() 的优雅方式
- 您能否更改 2d 数组在 C++/CUDA 中的排序方式
- MFC选项卡以编程方式排序
- 按降序排序的最佳方式
- 带跳过列表的双链接列表,以排序方式插入
- 如何在C++中以特定的方式对数组进行排序
- 以最佳方式排序
- 我在合并排序中传递此数组的方式有什么问题
- 如何使用 calloc/malloc 等函数对动态创建的存储进行正确排序,使其以 FIFO 方式运行
- 我能否以编程方式对 wxDataViewCtrl 的列重新排序
- 以排序方式迭代 std::vector<std::p air<T,U> > 对象
- 使用STL std::将方式排序为qsort_r
- C++矢量快速排序-似乎在不同的枢轴上工作方式不同
- std::map 的排序方式如何
- 链表排序方式的不同之处