在[C / C ++]中对链接列表进行排序的最佳算法是什么?
答案 0 :(得分:11)
合并排序适用于排序链表。一些细节here。示例C代码here。
为什么适合?好吧,简单来说,mergesort的主要组件 - 排序子序列的合并 - 可以在两个链表上轻松完成,因为它只需要比较头元素,因此它不需要数组的随机访问。
此外,这里有一篇名为A COMPARATIVE STUDY OF LINKED LIST SORTING ALGORITHMS的文章,您可能会感兴趣。
答案 1 :(得分:6)
更好的是,只需使用std::list
及其sort()
方法。
答案 2 :(得分:1)
取决于“最佳”的含义。你的意思是最快的实现,还是最有效的运行时?您排序的大小和特征也起着重要作用。排序10个项目与排序1000万个项目可能会导致不同的“最佳”算法。对于“最佳”意味着最快运行时间的大型数据集,我喜欢快速排序。
答案 3 :(得分:1)
基于堆栈的mergesort实现是首选武器。
前一段时间,我需要对双向链表进行排序。维基百科告诉我使用mergesort,因为它是三种常见的通用排序算法(heapsort,mergesort和quicksort)中唯一一种,当随机访问速度很慢甚至提供Simon Tatham's implementation的链接时,它运行良好。
首先,我re-implemented他的算法,它表明它基本上是众所周知的迭代版本。这是一个糟糕的选择,因为它依赖于随机访问,因此表现不佳。
recursive version更适合链接列表,因为它只是在分割时不必要地遍历其中一个列表而不是两者(就像Simon的变体一样)。
你应该使用的是stack-based version,因为这个实现完全摆脱了不必要的列表遍历。
答案 4 :(得分:0)
值得思考你是如何达到这一点的。如果您需要以特定方式对项目进行排序,请考虑对列表进行排序并将其直接插入到排序列表中。这样你就不必在需要时对其进行排序。