排序链表的最佳方法是什么?

时间:2009-11-14 06:23:08

标签: c algorithm list sorting

在[C / C ++]中对链接列表进行排序的最佳算法是什么?

5 个答案:

答案 0 :(得分:11)

合并排序适用于排序链表。一些细节here。示例C代码here

为什么适合?好吧,简单来说,mergesort的主要组件 - 排序子序列的合并 - 可以在两个链表上轻松完成,因为它只需要比较头元素,因此它不需要数组的随机访问。

此外,这里有一篇名为A COMPARATIVE STUDY OF LINKED LIST SORTING ALGORITHMS的文章,您可能会感兴趣。

答案 1 :(得分:6)

Merge sort

更好的是,只需使用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)

值得思考你是如何达到这一点的。如果您需要以特定方式对项目进行排序,请考虑对列表进行排序并将其直接插入到排序列表中。这样你就不必在需要时对其进行排序。